summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/benchmark.py263
-rwxr-xr-xtools/benchmark_test.py59
-rwxr-xr-xtools/build_benchmark_jsons.py20
-rwxr-xr-xtools/build_website.py8
-rwxr-xr-xtools/cargo_package.py166
-rwxr-xr-xtools/cargo_publish_others.py30
-rwxr-xr-xtools/complex_permissions_test.py223
-rw-r--r--tools/complex_permissions_test.ts38
-rwxr-xr-xtools/deno_dir_test.py52
-rw-r--r--tools/deno_http_proxy.ts24
-rw-r--r--tools/deno_tcp.ts35
-rw-r--r--tools/deno_tcp_proxy.ts35
-rwxr-xr-xtools/docs.py26
-rwxr-xr-xtools/fetch_test.py32
-rwxr-xr-xtools/fmt_test.py43
-rwxr-xr-xtools/format.py96
-rwxr-xr-xtools/http_benchmark.py213
-rwxr-xr-xtools/http_server.py197
-rw-r--r--tools/hyper_hello/Cargo.toml11
-rw-r--r--tools/hyper_hello/hyper_hello.rs39
-rwxr-xr-xtools/is_tty_test.py23
-rwxr-xr-xtools/lint.py64
-rw-r--r--tools/node_http.js9
-rw-r--r--tools/node_http_proxy.js28
-rw-r--r--tools/node_tcp.js18
-rw-r--r--tools/node_tcp_promise.js25
-rw-r--r--tools/node_tcp_proxy.js68
-rwxr-xr-xtools/permission_prompt_test.py144
-rw-r--r--tools/permission_prompt_test.ts67
-rw-r--r--tools/repl_test.py183
-rwxr-xr-xtools/run_node.py17
-rwxr-xr-xtools/setup.py185
-rw-r--r--tools/setup_test.py64
-rw-r--r--tools/sha256sum.py70
-rwxr-xr-xtools/sync_gclient.py13
-rwxr-xr-xtools/sync_node_modules.py6
-rwxr-xr-xtools/sync_python_modules.py6
-rw-r--r--tools/target_test.py56
-rwxr-xr-xtools/test_format.py21
-rw-r--r--tools/test_util.py140
-rw-r--r--tools/testdata/strace_summary.out39
-rw-r--r--tools/testdata/time.out18
-rw-r--r--tools/testdata/travis_benchmark.json3059
-rw-r--r--tools/testdata/unit_test_output1.txt238
-rw-r--r--tools/testdata/unit_test_output2.txt71
-rw-r--r--tools/testdata/unit_test_output3.txt268
-rw-r--r--tools/testdata/wrk1.txt14
-rw-r--r--tools/testdata/wrk2.txt13
-rw-r--r--tools/testdata/wrk3.txt13
-rw-r--r--tools/third_party.py270
-rwxr-xr-xtools/throughput_benchmark.py64
-rwxr-xr-xtools/upload_website.py22
-rw-r--r--tools/util.py413
-rwxr-xr-xtools/util_test.py42
54 files changed, 7361 insertions, 0 deletions
diff --git a/tools/benchmark.py b/tools/benchmark.py
new file mode 100755
index 000000000..85e126b88
--- /dev/null
+++ b/tools/benchmark.py
@@ -0,0 +1,263 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Performs benchmark and append data to //website/data.json.
+# If //website/data.json doesn't exist, this script tries to import it from
+# gh-pages branch.
+# To view the results locally run ./tools/http_server.py and visit
+# http://localhost:4545/website
+
+import os
+import sys
+import json
+import time
+import tempfile
+import subprocess
+from util import build_path, executable_suffix, root_path, run, run_output
+import third_party
+from http_benchmark import http_benchmark
+import throughput_benchmark
+import http_server
+
+# The list of the tuples of the benchmark name and arguments
+exec_time_benchmarks = [
+ ("hello", ["tests/002_hello.ts"]),
+ ("relative_import", ["tests/003_relative_import.ts"]),
+ ("error_001", ["tests/error_001.ts"]),
+ ("cold_hello", ["--reload", "tests/002_hello.ts"]),
+ ("cold_relative_import", ["--reload", "tests/003_relative_import.ts"]),
+ ("workers_startup", ["tests/workers_startup_bench.ts"]),
+ ("workers_round_robin", ["tests/workers_round_robin_bench.ts"]),
+]
+
+
+def read_json(filename):
+ with open(filename) as json_file:
+ return json.load(json_file)
+
+
+def write_json(filename, data):
+ with open(filename, 'w') as outfile:
+ json.dump(data, outfile)
+
+
+def get_binary_sizes(build_dir):
+ sizes = {}
+ mtimes = {}
+ # The deno executable should be located at the root of the build tree.
+ deno_exe = os.path.join(build_dir, "deno" + executable_suffix)
+ sizes["deno"] = os.path.getsize(deno_exe)
+ # Because cargo's OUT_DIR is not predictable, search the build tree for
+ # snapshot related files.
+ for parent_dir, _, file_names in os.walk(build_dir):
+ for file_name in file_names:
+ if not file_name in [
+ "CLI_SNAPSHOT.bin",
+ "CLI_SNAPSHOT.js",
+ "CLI_SNAPSHOT.js.map",
+ "COMPILER_SNAPSHOT.bin",
+ "COMPILER_SNAPSHOT.js",
+ "COMPILER_SNAPSHOT.js.map",
+ ]:
+ continue
+ file_path = os.path.join(parent_dir, file_name)
+ file_mtime = os.path.getmtime(file_path)
+ # If multiple copies of a file are found, use the most recent one.
+ if file_name in mtimes and mtimes[file_name] > file_mtime:
+ continue
+ mtimes[file_name] = file_mtime
+ sizes[file_name] = os.path.getsize(file_path)
+ return sizes
+
+
+def get_strace_summary_text(test_args):
+ f = tempfile.NamedTemporaryFile()
+ cmd = ["strace", "-c", "-f", "-o", f.name] + test_args
+ try:
+ subprocess.check_output(cmd)
+ except subprocess.CalledProcessError:
+ pass
+ return f.read()
+
+
+def strace_parse(summary_text):
+ summary = {}
+ # clear empty lines
+ lines = list(filter(lambda x: x and x != "\n", summary_text.split("\n")))
+ if len(lines) < 4:
+ return {} # malformed summary
+ lines, total_line = lines[2:-2], lines[-1]
+ # data to dict for each line
+ for line in lines:
+ syscall_fields = line.split()
+ syscall_name = syscall_fields[-1]
+ syscall_dict = {}
+ if 5 <= len(syscall_fields) <= 6:
+ syscall_dict = {
+ "% time": float(syscall_fields[0]),
+ "seconds": float(syscall_fields[1]),
+ "usecs/call": int(syscall_fields[2]),
+ "calls": int(syscall_fields[3])
+ }
+ syscall_dict["errors"] = 0 if len(syscall_fields) < 6 else int(
+ syscall_fields[4])
+ summary[syscall_name] = syscall_dict
+ # record overall (total) data
+ total_fields = total_line.split()
+ summary["total"] = {
+ "% time": float(total_fields[0]),
+ "seconds": float(total_fields[1]),
+ "calls": int(total_fields[2]),
+ "errors": int(total_fields[3])
+ }
+ return summary
+
+
+def get_strace_summary(test_args):
+ return strace_parse(get_strace_summary_text(test_args))
+
+
+def run_throughput(deno_exe):
+ m = {}
+ m["100M_tcp"] = throughput_benchmark.tcp(deno_exe, 100)
+ m["100M_cat"] = throughput_benchmark.cat(deno_exe, 100)
+ m["10M_tcp"] = throughput_benchmark.tcp(deno_exe, 10)
+ m["10M_cat"] = throughput_benchmark.cat(deno_exe, 10)
+ return m
+
+
+# "thread_count" and "syscall_count" are both calculated here.
+def run_strace_benchmarks(deno_exe, new_data):
+ thread_count = {}
+ syscall_count = {}
+ for (name, args) in exec_time_benchmarks:
+ s = get_strace_summary([deno_exe, "run"] + args)
+ thread_count[name] = s["clone"]["calls"] + 1
+ syscall_count[name] = s["total"]["calls"]
+ new_data["thread_count"] = thread_count
+ new_data["syscall_count"] = syscall_count
+
+
+# Takes the output from "/usr/bin/time -v" as input and extracts the 'maximum
+# resident set size' and returns it in bytes.
+def find_max_mem_in_bytes(time_v_output):
+ for line in time_v_output.split('\n'):
+ if 'maximum resident set size (kbytes)' in line.lower():
+ _, value = line.split(': ')
+ return int(value) * 1024
+
+
+def run_max_mem_benchmark(deno_exe):
+ results = {}
+ for (name, args) in exec_time_benchmarks:
+ cmd = ["/usr/bin/time", "-v", deno_exe, "run"] + args
+ try:
+ out = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ except subprocess.CalledProcessError:
+ pass
+ mem = find_max_mem_in_bytes(out)
+ results[name] = mem
+ return results
+
+
+def run_exec_time(deno_exe, build_dir):
+ third_party.download_hyperfine()
+ hyperfine_exe = third_party.get_prebuilt_tool_path("hyperfine")
+ benchmark_file = os.path.join(build_dir, "hyperfine_results.json")
+ run([
+ hyperfine_exe, "--ignore-failure", "--export-json", benchmark_file,
+ "--warmup", "3"
+ ] + [
+ deno_exe + " run " + " ".join(args)
+ for [_, args] in exec_time_benchmarks
+ ])
+ hyperfine_results = read_json(benchmark_file)
+ results = {}
+ for [[name, _], data] in zip(exec_time_benchmarks,
+ hyperfine_results["results"]):
+ results[name] = {
+ "mean": data["mean"],
+ "stddev": data["stddev"],
+ "user": data["user"],
+ "system": data["system"],
+ "min": data["min"],
+ "max": data["max"]
+ }
+ return results
+
+
+def run_http(build_dir, new_data):
+ stats = http_benchmark(build_dir)
+ new_data["req_per_sec"] = {k: v["req_per_sec"] for k, v in stats.items()}
+ new_data["max_latency"] = {k: v["max_latency"] for k, v in stats.items()}
+
+
+def bundle_benchmark(deno_exe):
+ bundles = {
+ "file_server": "./std/http/file_server.ts",
+ "gist": "./std/examples/gist.ts",
+ }
+
+ sizes = {}
+
+ for name, url in bundles.items():
+ # bundle
+ run([deno_exe, "bundle", url])
+ path = name + ".bundle.js"
+ # get size of bundle
+ assert os.path.exists(path)
+ sizes[name] = os.path.getsize(path)
+ # remove bundle
+ os.remove(path)
+
+ return sizes
+
+
+def main(argv):
+ if len(argv) == 2:
+ build_dir = sys.argv[1]
+ elif len(argv) == 1:
+ build_dir = build_path()
+ else:
+ print "Usage: tools/benchmark.py [build_dir]"
+ sys.exit(1)
+
+ sha1 = run_output(["git", "rev-parse", "HEAD"],
+ exit_on_fail=True).out.strip()
+ http_server.spawn()
+
+ deno_exe = os.path.join(build_dir, "deno")
+
+ os.chdir(root_path)
+
+ new_data = {
+ "created_at": time.strftime("%Y-%m-%dT%H:%M:%SZ"),
+ "sha1": sha1,
+ }
+
+ # TODO(ry) The "benchmark" benchmark should actually be called "exec_time".
+ # When this is changed, the historical data in gh-pages branch needs to be
+ # changed too.
+ new_data["benchmark"] = run_exec_time(deno_exe, build_dir)
+
+ new_data["binary_size"] = get_binary_sizes(build_dir)
+ new_data["bundle_size"] = bundle_benchmark(deno_exe)
+
+ # Cannot run throughput benchmark on windows because they don't have nc or
+ # pipe.
+ if os.name != 'nt':
+ new_data["throughput"] = run_throughput(deno_exe)
+ run_http(build_dir, new_data)
+
+ if "linux" in sys.platform:
+ run_strace_benchmarks(deno_exe, new_data)
+ new_data["max_memory"] = run_max_mem_benchmark(deno_exe)
+
+ print "===== <BENCHMARK RESULTS>"
+ print json.dumps(new_data, indent=2)
+ print "===== </BENCHMARK RESULTS>"
+
+ write_json(os.path.join(build_dir, "bench.json"), new_data)
+
+
+if __name__ == '__main__':
+ main(sys.argv)
diff --git a/tools/benchmark_test.py b/tools/benchmark_test.py
new file mode 100755
index 000000000..28d812647
--- /dev/null
+++ b/tools/benchmark_test.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import sys
+import os
+import unittest
+import benchmark
+from test_util import DenoTestCase, run_tests
+
+
+class TestBenchmark(DenoTestCase):
+ def test_strace_parse(self):
+ with open(
+ os.path.join(sys.path[0], "testdata/strace_summary.out"),
+ "r") as f:
+ summary = benchmark.strace_parse(f.read())
+ # first syscall line
+ assert summary["munmap"]["calls"] == 60
+ assert summary["munmap"]["errors"] == 0
+ # line with errors
+ assert summary["mkdir"]["errors"] == 2
+ # last syscall line
+ assert summary["prlimit64"]["calls"] == 2
+ assert summary["prlimit64"]["% time"] == 0
+ # summary line
+ assert summary["total"]["calls"] == 704
+
+ def test_max_mem_parse(self):
+ with open(os.path.join(sys.path[0], "testdata/time.out"), "r") as f:
+ data = f.read()
+ assert benchmark.find_max_mem_in_bytes(data) == 120380 * 1024
+
+ def test_binary_size(self):
+ binary_size_dict = benchmark.get_binary_sizes(self.build_dir)
+ assert binary_size_dict["deno"] > 0
+ assert binary_size_dict["CLI_SNAPSHOT.js"] > 0
+ assert binary_size_dict["CLI_SNAPSHOT.js.map"] > 0
+ assert binary_size_dict["CLI_SNAPSHOT.bin"] > 0
+
+ @unittest.skipIf("linux" not in sys.platform,
+ "strace only supported on linux")
+ def test_strace(self):
+ new_data = {}
+ benchmark.run_strace_benchmarks(self.deno_exe, new_data)
+ assert "thread_count" in new_data
+ assert "syscall_count" in new_data
+
+ s = new_data["thread_count"]
+ assert "hello" in s
+ assert s["hello"] > 1
+
+ s = new_data["syscall_count"]
+ assert "hello" in s
+ assert s["hello"] > 1
+
+
+if __name__ == '__main__':
+ # FIME this doesn't appear to be the case.
+ # This test assumes tools/http_server.py is running in the background.
+ run_tests()
diff --git a/tools/build_benchmark_jsons.py b/tools/build_benchmark_jsons.py
new file mode 100755
index 000000000..1d7a03401
--- /dev/null
+++ b/tools/build_benchmark_jsons.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+from util import build_path
+from benchmark import read_json, write_json
+import os
+
+current_data_file = os.path.join(build_path(), "bench.json")
+gh_pages_data_file = "gh-pages/data.json"
+all_data_file = "website/data.json" # Includes all benchmark data.
+recent_data_file = "website/recent.json" # Includes recent 20 benchmark data.
+
+assert os.path.exists(current_data_file)
+assert os.path.exists(gh_pages_data_file)
+
+new_data = read_json(current_data_file)
+all_data = read_json(gh_pages_data_file)
+all_data.append(new_data)
+
+write_json(all_data_file, all_data)
+write_json(recent_data_file, all_data[-20:])
diff --git a/tools/build_website.py b/tools/build_website.py
new file mode 100755
index 000000000..b519f3853
--- /dev/null
+++ b/tools/build_website.py
@@ -0,0 +1,8 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+from util import run, root_path, build_path
+
+os.chdir(os.path.join(root_path, "website"))
+deno_exe = os.path.join(build_path(), "deno")
+run([deno_exe, "bundle", "app.ts", "app.bundle.js"])
diff --git a/tools/cargo_package.py b/tools/cargo_package.py
new file mode 100755
index 000000000..29f5e7fb5
--- /dev/null
+++ b/tools/cargo_package.py
@@ -0,0 +1,166 @@
+#!/usr/bin/env python
+# Because of limitations in Cargo, Deno must dynamically build temporary source
+# directories in order to publish to crates.io.
+# The "deno" crate corresponds to the //core/ directory and depends on a
+# platform dependent crate binary crate containing pre-compiled libdeno
+# https://crates.io/crates/deno
+# https://crates.io/crates/deno-x86_64-pc-windows-msvc
+# https://crates.io/crates/deno-x86_64-apple-darwin
+# https://crates.io/crates/deno-x86_64-unknown-linux-gnu
+
+import os
+import sys
+import re
+import errno
+from shutil import copytree, ignore_patterns, copyfile
+from tempfile import mkdtemp
+from string import Template
+from util import root_path, run
+
+if sys.platform == "linux2":
+ llvm_target = "x86_64-unknown-linux-gnu"
+ static_lib_suffix = ".a"
+elif sys.platform == "darwin":
+ llvm_target = "x86_64-apple-darwin"
+ static_lib_suffix = ".a"
+elif sys.platform == "win32":
+ llvm_target = "x86_64-pc-windows-msvc"
+ static_lib_suffix = ".lib"
+else:
+ assert (False)
+
+lib_name = os.path.join(root_path, "target", "release", "obj",
+ "libdeno" + static_lib_suffix)
+
+
+def get_version(toml_path):
+ for line in open(toml_path):
+ match = re.search('version = "(.*)"', line)
+ if match:
+ return match.group(1)
+
+
+core_path = os.path.join(root_path, "core")
+cargo_toml_path = os.path.join(core_path, "Cargo.toml")
+version = get_version(cargo_toml_path)
+
+
+def main():
+ os.chdir(root_path)
+
+ run([
+ "cargo", "build", "-vv", "--manifest-path", cargo_toml_path, "--lib",
+ "--release", "--locked"
+ ])
+ assert (os.path.exists(lib_name))
+
+ root_temp = mkdtemp()
+ print "cargo package temp dir", root_temp
+
+ build_core(root_temp)
+ build_platform_crate(root_temp)
+
+ print "Now go into %s and run 'cargo publish' manually." % root_temp
+
+
+def build_core(root_temp):
+ core_temp = os.path.join(root_temp, "core")
+
+ # Copy entire core tree into temp directory, excluding build.rs and libdeno
+ # and unnecessary files.
+ copytree(
+ core_path,
+ core_temp,
+ ignore=ignore_patterns("build.rs", "libdeno", ".*", "*.gn", "*.orig"))
+
+ cargo_toml_temp = os.path.join(core_temp, "Cargo.toml")
+
+ t = cargo_toml_deps.substitute(VERSION=version)
+ # Append deps to //core/Cargo.toml
+ # This append is the entire reason we are copying the tree.
+ with open(cargo_toml_temp, "a") as f:
+ f.write(t)
+
+
+def build_platform_crate(root_temp):
+ platform_temp = os.path.join(root_temp, "platform")
+
+ copy_static_lib(platform_temp)
+
+ inputs = {"TARGET": llvm_target, "VERSION": version}
+
+ generate(platform_temp, "build.rs", platform_build_rs.substitute(inputs))
+ generate(platform_temp, "Cargo.toml",
+ platform_cargo_toml.substitute(inputs))
+ generate(platform_temp, "src/lib.rs", "")
+
+
+def copy_static_lib(platform_temp):
+ platform_lib = os.path.join(platform_temp, "lib/")
+ mkdir_p(platform_lib)
+ platform_lib_name = os.path.join(platform_lib, os.path.basename(lib_name))
+ assert (os.path.exists(lib_name))
+ copyfile(lib_name, platform_lib_name)
+
+
+platform_build_rs = Template("""
+fn main() {
+ use std::env::var;
+ use std::path::Path;
+ if var("TARGET")
+ .map(|target| target == "$TARGET")
+ .unwrap_or(false)
+ {
+ let dir = var("CARGO_MANIFEST_DIR").unwrap();
+ println!(
+ "cargo:rustc-link-search=native={}",
+ Path::new(&dir).join("lib").display()
+ );
+ }
+}
+""")
+
+platform_cargo_toml = Template("""
+[package]
+name = "deno-$TARGET"
+description = "Binary dependencies for the 'deno' crate"
+authors = ["The deno authors <bertbelder@nodejs.org>"]
+version = "$VERSION"
+build = "build.rs"
+include = ["src/*", "lib/*", "Cargo.toml", "build.rs"]
+license = "MIT"
+repository = "https://github.com/denoland/deno"
+""")
+
+cargo_toml_deps = Template("""
+[target.x86_64-apple-darwin.dependencies]
+deno-x86_64-apple-darwin = "=$VERSION"
+
+[target.x86_64-pc-windows-msvc.dependencies]
+deno-x86_64-pc-windows-msvc = "=$VERSION"
+
+[target.x86_64-unknown-linux-gnu.dependencies]
+deno-x86_64-unknown-linux-gnu = "=$VERSION"
+""")
+
+
+def mkdir_p(path):
+ try:
+ os.makedirs(path)
+ except OSError as exc:
+ if exc.errno == errno.EEXIST and os.path.isdir(path):
+ pass
+ else:
+ raise
+
+
+def generate(out_dir, filename, content):
+ path = os.path.join(out_dir, filename)
+ d = os.path.dirname(path)
+ mkdir_p(d)
+ with open(path, "w") as f:
+ f.write(content)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tools/cargo_publish_others.py b/tools/cargo_publish_others.py
new file mode 100755
index 000000000..83b9b50e2
--- /dev/null
+++ b/tools/cargo_publish_others.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+# Publishes 'deno_cli', 'deno_cli_snapshots', and 'deno_typescript' crates.
+# DOES NOT PUBLISH 'deno' crate see tools/cargo_package.py for that.
+
+import os
+import sys
+import argparse
+from util import run, root_path
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--dry-run", action="store_true")
+ args = parser.parse_args()
+
+ cargo_publish = ["cargo", "publish"]
+ if args.dry_run:
+ cargo_publish += ["--dry-run"]
+
+ # Publish the deno_typescript crate.
+ os.chdir(os.path.join(root_path, "deno_typescript"))
+ run(cargo_publish)
+
+ # Publish the deno_cli crate.
+ os.chdir(os.path.join(root_path, "cli"))
+ run(cargo_publish)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tools/complex_permissions_test.py b/tools/complex_permissions_test.py
new file mode 100755
index 000000000..9f0fcd7e7
--- /dev/null
+++ b/tools/complex_permissions_test.py
@@ -0,0 +1,223 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import unittest
+
+import http_server
+from test_util import DenoTestCase, run_tests
+from util import root_path, tty_capture
+
+PERMISSIONS_PROMPT_TEST_TS = "tools/complex_permissions_test.ts"
+
+PROMPT_PATTERN = b'⚠️'
+PERMISSION_DENIED_PATTERN = b'PermissionDenied: permission denied'
+
+
+@unittest.skipIf(os.name == 'nt', "Unable to test tty on Windows")
+class BaseComplexPermissionTest(DenoTestCase):
+ def _run_deno(self, flags, args):
+ "Returns (return_code, stdout, stderr)."
+ cmd = ([self.deno_exe, "run", "--no-prompt"] + flags +
+ [PERMISSIONS_PROMPT_TEST_TS] + args)
+ return tty_capture(cmd, b'')
+
+
+class BaseReadWritePermissionsTest(object):
+ test_type = None
+
+ def test_inside_project_dir(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-" + self.test_type + "=" + root_path],
+ [self.test_type, "package.json", "cli/tests/subdir/config.json"])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_outside_test_dir(self):
+ code, _stdout, stderr = self._run_deno([
+ "--allow-" + self.test_type + "=" + os.path.join(
+ root_path, "cli/tests")
+ ], [self.test_type, "package.json"])
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_inside_test_dir(self):
+ code, _stdout, stderr = self._run_deno([
+ "--allow-" + self.test_type + "=" + os.path.join(
+ root_path, "cli/tests")
+ ], [self.test_type, "cli/tests/subdir/config.json"])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_outside_test_and_js_dir(self):
+ code, _stdout, stderr = self._run_deno([
+ "--allow-" + self.test_type + "=" + os.path.join(
+ root_path, "cli/tests") + "," + os.path.join(
+ root_path, "cli/js")
+ ], [self.test_type, "package.json"])
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_inside_test_and_js_dir(self):
+ code, _stdout, stderr = self._run_deno([
+ "--allow-" + self.test_type + "=" + os.path.join(
+ root_path, "cli/tests") + "," + os.path.join(
+ root_path, "cli/js")
+ ], [
+ self.test_type, "cli/js/dir_test.ts",
+ "cli/tests/subdir/config.json"
+ ])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_relative(self):
+ # Save and restore curdir
+ saved_curdir = os.getcwd()
+ os.chdir(root_path)
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-" + self.test_type + "=" + "./cli/tests"],
+ [self.test_type, "cli/tests/subdir/config.json"])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+ os.chdir(saved_curdir)
+
+ def test_no_prefix(self):
+ # Save and restore curdir
+ saved_curdir = os.getcwd()
+ os.chdir(root_path)
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-" + self.test_type + "=" + "cli/tests"],
+ [self.test_type, "cli/tests/subdir/config.json"])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+ os.chdir(saved_curdir)
+
+
+class TestReadPermissions(BaseReadWritePermissionsTest,
+ BaseComplexPermissionTest):
+ test_type = "read"
+
+
+class TestWritePermissions(BaseReadWritePermissionsTest,
+ BaseComplexPermissionTest):
+ test_type = "write"
+
+
+class TestNetFetchPermissions(BaseComplexPermissionTest):
+ test_type = "netFetch"
+
+ def test_allow_localhost_4545(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=localhost:4545"],
+ [self.test_type, "http://localhost:4545"])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_allow_deno_land(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=deno.land"],
+ [self.test_type, "http://localhost:4545"])
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_allow_localhost_4545_fail(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=localhost:4545"],
+ [self.test_type, "http://localhost:4546"])
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_allow_localhost(self):
+ code, _stdout, stderr = self._run_deno(["--allow-net=localhost"], [
+ self.test_type, "http://localhost:4545", "http://localhost:4546",
+ "http://localhost:4547"
+ ])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+
+class TestNetDialPermissions(BaseComplexPermissionTest):
+ test_type = "netDial"
+
+ def test_allow_localhost_ip_4555(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=127.0.0.1:4545"], [self.test_type, "127.0.0.1:4545"])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_allow_deno_land(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=deno.land"], [self.test_type, "127.0.0.1:4545"])
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_allow_localhost_ip_4545_fail(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=127.0.0.1:4545"], [self.test_type, "127.0.0.1:4546"])
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_allow_localhost_ip(self):
+ code, _stdout, stderr = self._run_deno(["--allow-net=127.0.0.1"], [
+ self.test_type, "127.0.0.1:4545", "127.0.0.1:4546",
+ "127.0.0.1:4547"
+ ])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+
+class TestNetListenPermissions(BaseComplexPermissionTest):
+ test_type = "netListen"
+
+ def test_allow_localhost_4555(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=localhost:4555"], [self.test_type, "localhost:4555"])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_allow_deno_land(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=deno.land"], [self.test_type, "localhost:4545"])
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_allow_localhost_4555_fail(self):
+ code, _stdout, stderr = self._run_deno(
+ ["--allow-net=localhost:4555"], [self.test_type, "localhost:4556"])
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_allow_localhost(self):
+ code, _stdout, stderr = self._run_deno(["--allow-net=localhost"], [
+ self.test_type, "localhost:4555", "localhost:4556",
+ "localhost:4557"
+ ])
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+
+def complex_permissions_tests():
+ return BaseComplexPermissionTest.__subclasses__()
+
+
+if __name__ == "__main__":
+ run_tests()
diff --git a/tools/complex_permissions_test.ts b/tools/complex_permissions_test.ts
new file mode 100644
index 000000000..a2e0f7824
--- /dev/null
+++ b/tools/complex_permissions_test.ts
@@ -0,0 +1,38 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+const { args, readFileSync, writeFileSync, exit } = Deno;
+
+const name = args[1];
+const test: (args: string[]) => void = {
+ read(files: string[]): void {
+ files.forEach(file => readFileSync(file));
+ },
+ write(files: string[]): void {
+ files.forEach(file =>
+ writeFileSync(file, new Uint8Array(0), { append: true })
+ );
+ },
+ netFetch(hosts: string[]): void {
+ hosts.forEach(host => fetch(host));
+ },
+ netListen(hosts: string[]): void {
+ hosts.forEach(host => {
+ const [hostname, port] = host.split(":");
+ const listener = Deno.listen({ hostname, port: Number(port) });
+ listener.close();
+ });
+ },
+ async netDial(hosts: string[]): Promise<void> {
+ for (const host of hosts) {
+ const [hostname, port] = host.split(":");
+ const listener = await Deno.dial({ hostname, port: Number(port) });
+ listener.close();
+ }
+ }
+}[name];
+
+if (!test) {
+ console.log("Unknown test:", name);
+ exit(1);
+}
+
+test(args.slice(2));
diff --git a/tools/deno_dir_test.py b/tools/deno_dir_test.py
new file mode 100755
index 000000000..042475a81
--- /dev/null
+++ b/tools/deno_dir_test.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Check deno dir is created properly
+# Usage: deno_dir_test.py [path to deno dir]
+import os
+
+from test_util import DenoTestCase, run_tests
+from util import mkdtemp, rmtree, run_output
+
+
+class TestDenoDir(DenoTestCase):
+ def setUp(self):
+ self.old_deno_dir = None
+ if "DENO_DIR" in os.environ:
+ self.old_deno_dir = os.environ["DENO_DIR"]
+ del os.environ["DENO_DIR"]
+
+ def tearDown(self):
+ if self.old_deno_dir is not None:
+ os.environ["DENO_DIR"] = self.old_deno_dir
+
+ def test_deno_dir(self):
+ deno_dir = mkdtemp()
+ if os.path.isdir(deno_dir):
+ rmtree(deno_dir)
+
+ # Run deno with no env flag
+ self.run_deno()
+ assert not os.path.isdir(deno_dir)
+
+ # TODO(bartlomieju): reenable or rewrite these tests
+ # now all cache directories are lazily created
+ # Run deno with DENO_DIR env flag
+ # self.run_deno(deno_dir)
+ # assert os.path.isdir(deno_dir)
+ # assert os.path.isdir(os.path.join(deno_dir, "deps"))
+ # assert os.path.isdir(os.path.join(deno_dir, "gen"))
+ # rmtree(deno_dir)
+
+ def run_deno(self, deno_dir=None):
+ cmd = [
+ self.deno_exe, "run",
+ "http://localhost:4545/tests/subdir/print_hello.ts"
+ ]
+ deno_dir_env = {"DENO_DIR": deno_dir} if deno_dir is not None else None
+ res = run_output(cmd, quiet=True, env=deno_dir_env)
+ print res.code, res.out, res.err
+ self.assertEqual(res.code, 0)
+
+
+if __name__ == '__main__':
+ run_tests()
diff --git a/tools/deno_http_proxy.ts b/tools/deno_http_proxy.ts
new file mode 100644
index 000000000..728e4fd3f
--- /dev/null
+++ b/tools/deno_http_proxy.ts
@@ -0,0 +1,24 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import { serve, ServerRequest } from "../std/http/server.ts";
+
+const addr = Deno.args[1] || "127.0.0.1:4500";
+const originAddr = Deno.args[2] || "127.0.0.1:4501";
+const server = serve(addr);
+
+async function main(): Promise<void> {
+ console.log(`Proxy listening on http://${addr}/`);
+ for await (const req of server) {
+ proxyRequest(req);
+ }
+}
+
+async function proxyRequest(req: ServerRequest): Promise<void> {
+ const url = `http://${originAddr}${req.url}`;
+ const resp = await fetch(url, {
+ method: req.method,
+ headers: req.headers
+ });
+ req.respond(resp);
+}
+
+main();
diff --git a/tools/deno_tcp.ts b/tools/deno_tcp.ts
new file mode 100644
index 000000000..2b259cd38
--- /dev/null
+++ b/tools/deno_tcp.ts
@@ -0,0 +1,35 @@
+// Used for benchmarking Deno's networking. See tools/http_benchmark.py
+// TODO Replace this with a real HTTP server once
+// https://github.com/denoland/deno/issues/726 is completed.
+// Note: this is a keep-alive server.
+const addr = Deno.args[1] || "127.0.0.1:4500";
+const [hostname, port] = addr.split(":");
+const listener = Deno.listen({ hostname, port: Number(port) });
+const response = new TextEncoder().encode(
+ "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n"
+);
+
+async function handle(conn: Deno.Conn): Promise<void> {
+ const buffer = new Uint8Array(1024);
+ try {
+ while (true) {
+ const r = await conn.read(buffer);
+ if (r === Deno.EOF) {
+ break;
+ }
+ await conn.write(response);
+ }
+ } finally {
+ conn.close();
+ }
+}
+
+async function main(): Promise<void> {
+ console.log("Listening on", addr);
+ while (true) {
+ const conn = await listener.accept();
+ handle(conn);
+ }
+}
+
+main();
diff --git a/tools/deno_tcp_proxy.ts b/tools/deno_tcp_proxy.ts
new file mode 100644
index 000000000..23d219071
--- /dev/null
+++ b/tools/deno_tcp_proxy.ts
@@ -0,0 +1,35 @@
+// Used for benchmarking Deno's tcp proxy perfromance. See tools/http_benchmark.py
+const addr = Deno.args[1] || "127.0.0.1:4500";
+const originAddr = Deno.args[2] || "127.0.0.1:4501";
+
+const [hostname, port] = addr.split(":");
+const [originHostname, originPort] = originAddr.split(":");
+
+const listener = Deno.listen({ hostname, port: Number(port) });
+
+async function handle(conn: Deno.Conn): Promise<void> {
+ const origin = await Deno.dial({
+ hostname: originHostname,
+ port: Number(originPort)
+ });
+ try {
+ await Promise.all([Deno.copy(conn, origin), Deno.copy(origin, conn)]);
+ } catch (err) {
+ if (err.message !== "read error" && err.message !== "write error") {
+ throw err;
+ }
+ } finally {
+ conn.close();
+ origin.close();
+ }
+}
+
+async function main(): Promise<void> {
+ console.log(`Proxy listening on http://${addr}/`);
+ while (true) {
+ const conn = await listener.accept();
+ handle(conn);
+ }
+}
+
+main();
diff --git a/tools/docs.py b/tools/docs.py
new file mode 100755
index 000000000..901a633e0
--- /dev/null
+++ b/tools/docs.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import tempfile
+from util import run, root_path
+
+target_path = os.path.join(root_path, "target/")
+
+os.chdir(root_path)
+
+# Builds into target/doc
+run(["cargo", "doc", "--all", "--no-deps", "-vv"])
+
+# 'deno types' is stored in js/lib.deno_runtime.d.ts
+# We want to run typedoc on that declaration file only.
+os.chdir(os.path.join(root_path, "js"))
+
+# You must have typedoc installed seprately.
+# TODO Replace typedoc with something else ASAP. It's very awful.
+run([
+ "typedoc", "lib.deno_runtime.d.ts", "--out",
+ os.path.join(target_path, "typedoc"), "--entryPoint", "Deno",
+ "--ignoreCompilerErrors", "--includeDeclarations", "--excludeExternals",
+ "--excludePrivate", "--excludeProtected", "--mode", "file", "--name",
+ "deno", "--theme", "minimal", "--readme", "none"
+])
diff --git a/tools/fetch_test.py b/tools/fetch_test.py
new file mode 100755
index 000000000..e6e5cb6a0
--- /dev/null
+++ b/tools/fetch_test.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import shutil
+import sys
+
+import http_server
+from test_util import DenoTestCase, run_tests
+from util import mkdtemp, tests_path, run_output
+
+
+class TestFetch(DenoTestCase):
+ def test_fetch(self):
+ deno_dir = mkdtemp()
+ try:
+ t = os.path.join(tests_path, "006_url_imports.ts")
+ result = run_output([self.deno_exe, "fetch", t],
+ quiet=True,
+ merge_env={"DENO_DIR": deno_dir})
+ self.assertEqual(result.out, "")
+ self.assertEqual(result.code, 0)
+ # Check that we actually did the prefetch.
+ os.path.exists(
+ os.path.join(
+ deno_dir,
+ "deps/http/localhost_PORT4545/tests/subdir/mod2.ts"))
+ finally:
+ shutil.rmtree(deno_dir)
+
+
+if __name__ == "__main__":
+ run_tests()
diff --git a/tools/fmt_test.py b/tools/fmt_test.py
new file mode 100755
index 000000000..ca7cc7c20
--- /dev/null
+++ b/tools/fmt_test.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import shutil
+
+from test_util import DenoTestCase, run_tests
+from util import mkdtemp, root_path, tests_path, run_output
+
+
+class TestFmt(DenoTestCase):
+ def test_fmt(self):
+ d = mkdtemp()
+ try:
+ fixed_filename = os.path.join(tests_path,
+ "badly_formatted_fixed.js")
+ src = os.path.join(tests_path, "badly_formatted.js")
+ dst = os.path.join(d, "badly_formatted.js")
+ shutil.copyfile(src, dst)
+
+ # Set DENO_DIR to the temp dir to test an initial fetch of prettier.
+ # TODO(ry) This make the test depend on internet access which is not
+ # ideal. We should have prettier in the repo already, and we could
+ # fetch it instead through tools/http_server.py.
+ deno_dir = d
+
+ result = run_output(
+ [os.path.join(root_path, self.deno_exe), "fmt", dst],
+ cwd=d,
+ merge_env={"DENO_DIR": deno_dir},
+ exit_on_fail=True,
+ quiet=True)
+ self.assertEqual(result.code, 0)
+ with open(fixed_filename) as f:
+ expected = f.read()
+ with open(dst) as f:
+ actual = f.read()
+ self.assertEqual(expected, actual)
+ finally:
+ shutil.rmtree(d)
+
+
+if __name__ == "__main__":
+ run_tests()
diff --git a/tools/format.py b/tools/format.py
new file mode 100755
index 000000000..ac6035804
--- /dev/null
+++ b/tools/format.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+# Copyright 2018 the Deno authors. All rights reserved. MIT license.
+import os
+import sys
+import argparse
+from third_party import get_buildtools_tool_path, google_env, python_env
+from util import git_ls_files, third_party_path, root_path, run
+
+
+def main():
+ os.chdir(root_path)
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--cc", help="run clang-format", action="store_true")
+ parser.add_argument("--gn", help="run gn format", action="store_true")
+ parser.add_argument("--js", help="run prettier", action="store_true")
+ parser.add_argument("--py", help="run yapf", action="store_true")
+ parser.add_argument("--rs", help="run rustfmt", action="store_true")
+ args = parser.parse_args()
+
+ did_fmt = False
+ if args.cc:
+ clang_format()
+ did_fmt = True
+ if args.gn:
+ gn_format()
+ did_fmt = True
+ if args.js:
+ prettier()
+ did_fmt = True
+ if args.py:
+ yapf()
+ did_fmt = True
+ if args.rs:
+ rustfmt()
+ did_fmt = True
+
+ if not did_fmt:
+ clang_format()
+ gn_format()
+ prettier()
+ yapf()
+ rustfmt()
+
+
+def clang_format():
+ print "clang-format"
+ exe = get_buildtools_tool_path("clang-format")
+ source_files = git_ls_files(root_path, ["*.cc", "*.h"])
+ run([exe, "-i", "-style", "Google", "--"] + source_files,
+ env=google_env(),
+ quiet=True)
+
+
+def gn_format():
+ print "gn format"
+ exe = get_buildtools_tool_path("gn")
+ source_files = git_ls_files(root_path, ["*.gn", "*.gni"])
+ run([exe, "format", "--"] + source_files, env=google_env(), quiet=True)
+
+
+def prettier():
+ print "prettier"
+ script = os.path.join(third_party_path, "node_modules", "prettier",
+ "bin-prettier.js")
+ source_files = git_ls_files(root_path, ["*.js", "*.json", "*.ts", "*.md"])
+ run(["node", script, "--write", "--loglevel=error", "--"] + source_files,
+ shell=False,
+ quiet=True)
+
+
+def yapf():
+ print "yapf"
+ script = os.path.join(third_party_path, "python_packages", "bin", "yapf")
+ source_files = git_ls_files(root_path, ["*.py"])
+ run([sys.executable, script, "-i", "--"] + source_files,
+ env=python_env(),
+ shell=False,
+ quiet=True)
+
+
+def rustfmt():
+ print "rustfmt"
+ config_file = os.path.join(root_path, ".rustfmt.toml")
+ source_files = git_ls_files(root_path, ["*.rs"])
+ run([
+ "rustfmt",
+ "--config-path=" + config_file,
+ "--",
+ ] + source_files,
+ shell=False,
+ quiet=True)
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/tools/http_benchmark.py b/tools/http_benchmark.py
new file mode 100755
index 000000000..4f2c768fd
--- /dev/null
+++ b/tools/http_benchmark.py
@@ -0,0 +1,213 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import sys
+import time
+import subprocess
+import util
+
+# Some of the benchmarks in this file have been renamed. In case the history
+# somehow gets messed up:
+# "node_http" was once called "node"
+# "deno_tcp" was once called "deno"
+# "deno_http" was once called "deno_net_http"
+
+DURATION = "10s"
+
+LAST_PORT = 4544
+
+
+def server_addr(port):
+ return "0.0.0.0:%s" % port
+
+
+def get_port(port=None):
+ global LAST_PORT
+ if port is None:
+ port = LAST_PORT
+ LAST_PORT = LAST_PORT + 1
+ # Return port as str because all usages below are as a str and having it an
+ # integer just adds complexity.
+ return str(port)
+
+
+def deno_tcp(deno_exe):
+ port = get_port()
+ deno_cmd = [
+ deno_exe, "run", "--allow-net", "tools/deno_tcp.ts",
+ server_addr(port)
+ ]
+ print "http_benchmark testing DENO tcp."
+ return run(deno_cmd, port)
+
+
+def deno_tcp_current_thread(deno_exe):
+ port = get_port()
+ deno_cmd = [
+ deno_exe, "run", "--current-thread", "--allow-net",
+ "tools/deno_tcp.ts",
+ server_addr(port)
+ ]
+ print "http_benchmark testing DENO tcp (single-thread)."
+ return run(deno_cmd, port)
+
+
+def deno_http(deno_exe):
+ port = get_port()
+ deno_cmd = [
+ deno_exe, "run", "--allow-net", "std/http/http_bench.ts",
+ server_addr(port)
+ ]
+ print "http_benchmark testing DENO using net/http."
+ return run(deno_cmd, port)
+
+
+def deno_tcp_proxy(deno_exe, hyper_hello_exe):
+ port = get_port()
+ origin_port = get_port()
+ deno_cmd = [
+ deno_exe, "run", "--allow-net", "tools/deno_tcp_proxy.ts",
+ server_addr(port),
+ server_addr(origin_port)
+ ]
+ print "http_proxy_benchmark testing DENO using net/tcp."
+ return run(
+ deno_cmd,
+ port,
+ origin_cmd=http_proxy_origin(hyper_hello_exe, origin_port))
+
+
+def deno_http_proxy(deno_exe, hyper_hello_exe):
+ port = get_port()
+ origin_port = get_port()
+ deno_cmd = [
+ deno_exe, "run", "--allow-net", "tools/deno_http_proxy.ts",
+ server_addr(port),
+ server_addr(origin_port)
+ ]
+ print "http_proxy_benchmark testing DENO using net/http."
+ return run(
+ deno_cmd,
+ port,
+ origin_cmd=http_proxy_origin(hyper_hello_exe, origin_port))
+
+
+def deno_core_single(exe):
+ print "http_benchmark testing deno_core_single"
+ return run([exe, "--single-thread"], 4544)
+
+
+def deno_core_multi(exe):
+ print "http_benchmark testing deno_core_multi"
+ return run([exe, "--multi-thread"], 4544)
+
+
+def node_http():
+ port = get_port()
+ node_cmd = ["node", "tools/node_http.js", port]
+ print "http_benchmark testing NODE."
+ return run(node_cmd, port)
+
+
+def node_http_proxy(hyper_hello_exe):
+ port = get_port()
+ origin_port = get_port()
+ node_cmd = ["node", "tools/node_http_proxy.js", port, origin_port]
+ print "http_proxy_benchmark testing NODE."
+ return run(node_cmd, port, None,
+ http_proxy_origin(hyper_hello_exe, origin_port))
+
+
+def node_tcp_proxy(hyper_hello_exe):
+ port = get_port()
+ origin_port = get_port()
+ node_cmd = ["node", "tools/node_tcp_proxy.js", port, origin_port]
+ print "http_proxy_benchmark testing NODE tcp."
+ return run(node_cmd, port, None,
+ http_proxy_origin(hyper_hello_exe, origin_port))
+
+
+def node_tcp():
+ port = get_port()
+ node_cmd = ["node", "tools/node_tcp.js", port]
+ print "http_benchmark testing node_tcp.js"
+ return run(node_cmd, port)
+
+
+def http_proxy_origin(hyper_hello_exe, port):
+ return [hyper_hello_exe, port]
+
+
+def hyper_http(hyper_hello_exe):
+ port = get_port()
+ hyper_cmd = [hyper_hello_exe, port]
+ print "http_benchmark testing RUST hyper."
+ return run(hyper_cmd, port)
+
+
+def http_benchmark(build_dir):
+ hyper_hello_exe = os.path.join(build_dir, "hyper_hello")
+ core_http_bench_exe = os.path.join(build_dir,
+ "examples/deno_core_http_bench")
+ deno_exe = os.path.join(build_dir, "deno")
+ return {
+ # "deno_tcp" was once called "deno"
+ "deno_tcp": deno_tcp(deno_exe),
+ "deno_tcp_current_thread": deno_tcp_current_thread(deno_exe),
+ # "deno_http" was once called "deno_net_http"
+ "deno_http": deno_http(deno_exe),
+ "deno_proxy": deno_http_proxy(deno_exe, hyper_hello_exe),
+ "deno_proxy_tcp": deno_tcp_proxy(deno_exe, hyper_hello_exe),
+ "deno_core_single": deno_core_single(core_http_bench_exe),
+ "deno_core_multi": deno_core_multi(core_http_bench_exe),
+ # "node_http" was once called "node"
+ "node_http": node_http(),
+ "node_proxy": node_http_proxy(hyper_hello_exe),
+ "node_proxy_tcp": node_tcp_proxy(hyper_hello_exe),
+ "node_tcp": node_tcp(),
+ "hyper": hyper_http(hyper_hello_exe)
+ }
+
+
+def run(server_cmd, port, merge_env=None, origin_cmd=None):
+
+ # Run deno echo server in the background.
+ if merge_env is None:
+ env = None
+ else:
+ env = os.environ.copy()
+ for key, value in merge_env.iteritems():
+ env[key] = value
+
+ # Wait for port 4544 to become available.
+ # TODO Need to use SO_REUSEPORT with tokio::net::TcpListener.
+ time.sleep(5)
+
+ origin = None
+ if origin_cmd is not None:
+ origin = subprocess.Popen(origin_cmd, env=env)
+
+ print server_cmd
+ server = subprocess.Popen(server_cmd, env=env)
+
+ time.sleep(5) # wait for server to wake up. TODO racy.
+
+ try:
+ cmd = "third_party/wrk/%s/wrk -d %s --latency http://127.0.0.1:%s/" % (
+ util.platform(), DURATION, port)
+ print cmd
+ output = subprocess.check_output(cmd, shell=True)
+ stats = util.parse_wrk_output(output)
+ print output
+ return stats
+ finally:
+ server.kill()
+ if origin is not None:
+ origin.kill()
+
+
+if __name__ == '__main__':
+ if len(sys.argv) < 2:
+ print "Usage ./tools/http_benchmark.py target/debug/deno"
+ sys.exit(1)
+ deno_http(sys.argv[1])
diff --git a/tools/http_server.py b/tools/http_server.py
new file mode 100755
index 000000000..1951c9e53
--- /dev/null
+++ b/tools/http_server.py
@@ -0,0 +1,197 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Many tests expect there to be an http server on port 4545 servering the deno
+# root directory.
+from collections import namedtuple
+from contextlib import contextmanager
+import os
+import SimpleHTTPServer
+import SocketServer
+import sys
+from time import sleep
+from threading import Thread
+from util import root_path
+
+PORT = 4545
+REDIRECT_PORT = 4546
+ANOTHER_REDIRECT_PORT = 4547
+DOUBLE_REDIRECTS_PORT = 4548
+INF_REDIRECTS_PORT = 4549
+
+QUIET = '-v' not in sys.argv and '--verbose' not in sys.argv
+
+
+class QuietSimpleHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
+ def log_request(self, code='-', size='-'):
+ if not QUIET:
+ SimpleHTTPServer.SimpleHTTPRequestHandler.log_request(
+ self, code, size)
+
+
+class ContentTypeHandler(QuietSimpleHTTPRequestHandler):
+ def do_GET(self):
+ if "multipart_form_data.txt" in self.path:
+ self.protocol_version = 'HTTP/1.1'
+ self.send_response(200, 'OK')
+ self.send_header('Content-type',
+ 'multipart/form-data;boundary=boundary')
+ self.end_headers()
+ self.wfile.write(
+ bytes('Preamble\r\n'
+ '--boundary\t \r\n'
+ 'Content-Disposition: form-data; name="field_1"\r\n'
+ '\r\n'
+ 'value_1 \r\n'
+ '\r\n--boundary\r\n'
+ 'Content-Disposition: form-data; name="field_2"; '
+ 'filename="file.js"\r\n'
+ 'Content-Type: text/javascript\r\n'
+ '\r\n'
+ 'console.log("Hi")'
+ '\r\n--boundary--\r\n'
+ 'Epilogue'))
+ return
+ return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
+
+ def do_POST(self):
+ # Simple echo server for request reflection
+ if "echo_server" in self.path:
+ self.protocol_version = 'HTTP/1.1'
+ self.send_response(200, 'OK')
+ if self.headers.has_key('content-type'):
+ self.send_header('content-type',
+ self.headers.getheader('content-type'))
+ if self.headers.has_key('user-agent'):
+ self.send_header('user-agent',
+ self.headers.getheader('user-agent'))
+ self.end_headers()
+ data_string = self.rfile.read(int(self.headers['Content-Length']))
+ self.wfile.write(bytes(data_string))
+ return
+ self.protocol_version = 'HTTP/1.1'
+ self.send_response(501)
+ self.send_header('content-type', 'text/plain')
+ self.end_headers()
+ self.wfile.write(bytes('Server does not support this operation'))
+
+ def guess_type(self, path):
+ if ".t1." in path:
+ return "text/typescript"
+ if ".t2." in path:
+ return "video/vnd.dlna.mpeg-tts"
+ if ".t3." in path:
+ return "video/mp2t"
+ if ".t4." in path:
+ return "application/x-typescript"
+ if ".j1." in path:
+ return "text/javascript"
+ if ".j2." in path:
+ return "application/ecmascript"
+ if ".j3." in path:
+ return "text/ecmascript"
+ if ".j4." in path:
+ return "application/x-javascript"
+ if "form_urlencoded" in path:
+ return "application/x-www-form-urlencoded"
+ if "no_ext" in path:
+ return "text/typescript"
+ if "unknown_ext" in path:
+ return "text/typescript"
+ if "mismatch_ext" in path:
+ return "text/javascript"
+ return SimpleHTTPServer.SimpleHTTPRequestHandler.guess_type(self, path)
+
+
+RunningServer = namedtuple("RunningServer", ["server", "thread"])
+
+
+def server():
+ os.chdir(root_path) # Hopefully the main thread doesn't also chdir.
+ Handler = ContentTypeHandler
+ Handler.extensions_map.update({
+ ".ts": "application/typescript",
+ ".js": "application/javascript",
+ ".json": "application/json",
+ })
+ SocketServer.TCPServer.allow_reuse_address = True
+ s = SocketServer.TCPServer(("", PORT), Handler)
+ if not QUIET:
+ print "Deno test server http://localhost:%d/" % PORT
+ return RunningServer(s, start(s))
+
+
+def base_redirect_server(host_port, target_port, extra_path_segment=""):
+ os.chdir(root_path)
+ target_host = "http://localhost:%d" % target_port
+
+ class RedirectHandler(QuietSimpleHTTPRequestHandler):
+ def do_GET(self):
+ self.send_response(301)
+ self.send_header('Location',
+ target_host + extra_path_segment + self.path)
+ self.end_headers()
+
+ Handler = RedirectHandler
+ SocketServer.TCPServer.allow_reuse_address = True
+ s = SocketServer.TCPServer(("", host_port), Handler)
+ if not QUIET:
+ print "redirect server http://localhost:%d/ -> http://localhost:%d/" % (
+ host_port, target_port)
+ return RunningServer(s, start(s))
+
+
+# redirect server
+def redirect_server():
+ return base_redirect_server(REDIRECT_PORT, PORT)
+
+
+# another redirect server pointing to the same port as the one above
+# BUT with an extra subdir path
+def another_redirect_server():
+ return base_redirect_server(
+ ANOTHER_REDIRECT_PORT, PORT, extra_path_segment="/tests/subdir")
+
+
+# redirect server that points to another redirect server
+def double_redirects_server():
+ return base_redirect_server(DOUBLE_REDIRECTS_PORT, REDIRECT_PORT)
+
+
+# redirect server that points to itself
+def inf_redirects_server():
+ return base_redirect_server(INF_REDIRECTS_PORT, INF_REDIRECTS_PORT)
+
+
+def start(s):
+ thread = Thread(target=s.serve_forever, kwargs={"poll_interval": 0.05})
+ thread.daemon = True
+ thread.start()
+ return thread
+
+
+@contextmanager
+def spawn():
+ servers = (server(), redirect_server(), another_redirect_server(),
+ double_redirects_server())
+ while any(not s.thread.is_alive() for s in servers):
+ sleep(0.01)
+ try:
+ yield
+ finally:
+ for s in servers:
+ s.server.shutdown()
+
+
+def main():
+ servers = (server(), redirect_server(), another_redirect_server(),
+ double_redirects_server(), inf_redirects_server())
+ try:
+ while all(s.thread.is_alive() for s in servers):
+ sleep(10)
+ except KeyboardInterrupt:
+ pass
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/hyper_hello/Cargo.toml b/tools/hyper_hello/Cargo.toml
new file mode 100644
index 000000000..8d4048289
--- /dev/null
+++ b/tools/hyper_hello/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "hyper_hello"
+version = "0.0.1"
+
+[dependencies]
+hyper = "0.12.34"
+ring = "0.16.9"
+
+[[bin]]
+name = "hyper_hello"
+path = "hyper_hello.rs"
diff --git a/tools/hyper_hello/hyper_hello.rs b/tools/hyper_hello/hyper_hello.rs
new file mode 100644
index 000000000..9491b0750
--- /dev/null
+++ b/tools/hyper_hello/hyper_hello.rs
@@ -0,0 +1,39 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+// Adapted from https://github.com/hyperium/hyper/blob/master/examples/hello.rs
+
+#![deny(warnings)]
+extern crate hyper;
+
+use hyper::rt::{self, Future};
+use hyper::service::service_fn_ok;
+use hyper::{Body, Response, Server};
+use std::env;
+
+static PHRASE: &[u8] = b"Hello World!";
+
+fn main() {
+ let mut port: u16 = 4544;
+ if let Some(custom_port) = env::args().nth(1) {
+ port = custom_port.parse::<u16>().unwrap();
+ }
+
+ let addr = ([127, 0, 0, 1], port).into();
+
+ // new_service is run for each connection, creating a 'service'
+ // to handle requests for that specific connection.
+ let new_service = || {
+ // This is the `Service` that will handle the connection.
+ // `service_fn_ok` is a helper to convert a function that
+ // returns a Response into a `Service`.
+ service_fn_ok(|_| Response::new(Body::from(PHRASE)))
+ };
+
+ let server = Server::bind(&addr)
+ .tcp_nodelay(true)
+ .serve(new_service)
+ .map_err(|e| eprintln!("server error: {}", e));
+
+ println!("Listening on http://{}", addr);
+
+ rt::run(server);
+}
diff --git a/tools/is_tty_test.py b/tools/is_tty_test.py
new file mode 100755
index 000000000..16a4ef255
--- /dev/null
+++ b/tools/is_tty_test.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import unittest
+from sys import stdin
+
+from test_util import DenoTestCase, run_tests
+from util import tty_capture
+
+IS_TTY_TEST_TS = "tests/is_tty.ts"
+
+
+@unittest.skipIf(os.name == 'nt', "Unable to test tty on Windows")
+class TestIsTty(DenoTestCase):
+ def test_is_tty(self):
+ cmd = [self.deno_exe, "run", IS_TTY_TEST_TS]
+ code, stdout, _ = tty_capture(cmd, b'')
+ assert code == 0
+ assert str(stdin.isatty()).lower() in stdout
+
+
+if __name__ == "__main__":
+ run_tests()
diff --git a/tools/lint.py b/tools/lint.py
new file mode 100755
index 000000000..e71d5d0ef
--- /dev/null
+++ b/tools/lint.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Does google-lint on c++ files and ts-lint on typescript files
+
+import os
+import sys
+from util import enable_ansi_colors, git_ls_files, libdeno_path, root_path, run
+from util import third_party_path
+from third_party import python_env
+
+
+def main():
+ enable_ansi_colors()
+ os.chdir(root_path)
+ cpplint()
+ eslint()
+ pylint()
+
+
+def cpplint():
+ print "cpplint"
+ script = os.path.join(third_party_path, "cpplint", "cpplint.py")
+ source_files = git_ls_files(libdeno_path, ["*.cc", "*.h"])
+ run([
+ sys.executable,
+ script,
+ "--quiet",
+ "--filter=-build/include_subdir",
+ "--repository=" + libdeno_path,
+ "--",
+ ] + source_files,
+ env=python_env(),
+ shell=False,
+ quiet=True)
+
+
+def eslint():
+ print "eslint"
+ script = os.path.join(third_party_path, "node_modules", "eslint", "bin",
+ "eslint")
+ # Find all *directories* in the main repo that contain .ts/.js files.
+ source_files = git_ls_files(root_path, ["*.js", "*.ts"])
+ source_dirs = set([os.path.dirname(f) for f in source_files])
+ # Within the source dirs, eslint does its own globbing, taking into account
+ # the exclusion rules listed in '.eslintignore'.
+ source_globs = ["%s/*.{js,ts}" % d for d in source_dirs]
+ run(["node", script, "--max-warnings=0", "--"] + source_globs,
+ shell=False,
+ quiet=True)
+
+
+def pylint():
+ print "pylint"
+ script = os.path.join(third_party_path, "python_packages", "pylint")
+ rcfile = os.path.join(third_party_path, "depot_tools", "pylintrc")
+ source_files = git_ls_files(root_path, ["*.py", ":!:gclient_config.py"])
+ run([sys.executable, script, "--rcfile=" + rcfile, "--"] + source_files,
+ env=python_env(),
+ shell=False,
+ quiet=True)
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/tools/node_http.js b/tools/node_http.js
new file mode 100644
index 000000000..2439cfc43
--- /dev/null
+++ b/tools/node_http.js
@@ -0,0 +1,9 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+const http = require("http");
+const port = process.argv[2] || "4544";
+console.log("port", port);
+http
+ .Server((req, res) => {
+ res.end("Hello World\n");
+ })
+ .listen(port);
diff --git a/tools/node_http_proxy.js b/tools/node_http_proxy.js
new file mode 100644
index 000000000..75dd5a371
--- /dev/null
+++ b/tools/node_http_proxy.js
@@ -0,0 +1,28 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+const http = require("http");
+const port = process.argv[2] || "4544";
+const originPort = process.argv[3] || "4545";
+console.log("port", port);
+http
+ .Server((req, res) => {
+ const options = {
+ port: originPort,
+ path: req.url,
+ method: req.method,
+ headers: req.headers
+ };
+
+ const proxy = http.request(options, proxyRes => {
+ res.writeHead(proxyRes.statusCode, proxyRes.headers);
+ proxyRes.pipe(
+ res,
+ { end: true }
+ );
+ });
+
+ req.pipe(
+ proxy,
+ { end: true }
+ );
+ })
+ .listen(port);
diff --git a/tools/node_tcp.js b/tools/node_tcp.js
new file mode 100644
index 000000000..1e68fc05f
--- /dev/null
+++ b/tools/node_tcp.js
@@ -0,0 +1,18 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+// Note: this is a keep-alive server.
+const { Server } = require("net");
+const port = process.argv[2] || "4544";
+console.log("port", port);
+
+const response = Buffer.from(
+ "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n"
+);
+
+Server(socket => {
+ socket.on("data", _ => {
+ socket.write(response);
+ });
+ socket.on("error", _ => {
+ socket.destroy();
+ });
+}).listen(port);
diff --git a/tools/node_tcp_promise.js b/tools/node_tcp_promise.js
new file mode 100644
index 000000000..c6de120b1
--- /dev/null
+++ b/tools/node_tcp_promise.js
@@ -0,0 +1,25 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+// Note: this is a keep-alive server.
+const { Server } = require("net");
+const port = process.argv[2] || "4544";
+console.log("port", port);
+
+const response = Buffer.from(
+ "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n"
+);
+
+async function write(socket, buffer) {
+ const p = new Promise((resolve, _) => {
+ socket.write(buffer, resolve);
+ });
+ return p;
+}
+
+Server(async socket => {
+ socket.on("error", _ => {
+ socket.destroy();
+ });
+ for await (const _ of socket) {
+ write(socket, response);
+ }
+}).listen(port);
diff --git a/tools/node_tcp_proxy.js b/tools/node_tcp_proxy.js
new file mode 100644
index 000000000..7dc1b2612
--- /dev/null
+++ b/tools/node_tcp_proxy.js
@@ -0,0 +1,68 @@
+const net = require("net");
+
+process.on("uncaughtException", function(error) {
+ console.error(error);
+});
+
+if (process.argv.length != 4) {
+ console.log("usage: %s <localport> <remoteport>", process.argv[1]);
+ process.exit();
+}
+
+const localport = process.argv[2];
+const remoteport = process.argv[3];
+
+const remotehost = "127.0.0.1";
+
+const server = net.createServer(function(localsocket) {
+ const remotesocket = new net.Socket();
+
+ remotesocket.connect(remoteport, remotehost);
+
+ localsocket.on("data", function(data) {
+ const flushed = remotesocket.write(data);
+ if (!flushed) {
+ localsocket.pause();
+ }
+ });
+
+ remotesocket.on("data", function(data) {
+ const flushed = localsocket.write(data);
+ if (!flushed) {
+ remotesocket.pause();
+ }
+ });
+
+ localsocket.on("drain", function() {
+ remotesocket.resume();
+ });
+
+ remotesocket.on("drain", function() {
+ localsocket.resume();
+ });
+
+ localsocket.on("close", function() {
+ remotesocket.end();
+ });
+
+ remotesocket.on("close", function() {
+ localsocket.end();
+ });
+
+ localsocket.on("error", function() {
+ localsocket.end();
+ });
+
+ remotesocket.on("error", function() {
+ remotesocket.end();
+ });
+});
+
+server.listen(localport);
+
+console.log(
+ "redirecting connections from 127.0.0.1:%d to %s:%d",
+ localport,
+ remotehost,
+ remoteport
+);
diff --git a/tools/permission_prompt_test.py b/tools/permission_prompt_test.py
new file mode 100755
index 000000000..e5516e450
--- /dev/null
+++ b/tools/permission_prompt_test.py
@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import unittest
+
+from test_util import DenoTestCase, run_tests
+from util import tty_capture
+
+PERMISSIONS_PROMPT_TEST_TS = "tools/permission_prompt_test.ts"
+
+PROMPT_PATTERN = b'⚠️'
+FIRST_CHECK_FAILED_PATTERN = b'First check failed'
+PERMISSION_DENIED_PATTERN = b'PermissionDenied: permission denied'
+
+
+@unittest.skipIf(os.name == 'nt', "Unable to test tty on Windows")
+class BasePromptTest(object):
+ def _run_deno(self, flags, args, bytes_input):
+ "Returns (return_code, stdout, stderr)."
+ cmd = [self.deno_exe, "run"] + flags + [PERMISSIONS_PROMPT_TEST_TS
+ ] + args
+ return tty_capture(cmd, bytes_input)
+
+ def test_allow_flag(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ ["--allow-" + test_type], ["needs" + test_type.capitalize()], b'')
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert FIRST_CHECK_FAILED_PATTERN not in stdout
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_yes_yes(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ [], ["needs" + test_type.capitalize()], b'y\ny\n')
+ assert code == 0
+ assert PROMPT_PATTERN in stderr
+ assert FIRST_CHECK_FAILED_PATTERN not in stdout
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_yes_no(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ [], ["needs" + test_type.capitalize()], b'y\nn\n')
+ assert code == 1
+ assert PROMPT_PATTERN in stderr
+ assert FIRST_CHECK_FAILED_PATTERN not in stdout
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_no_no(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ [], ["needs" + test_type.capitalize()], b'n\nn\n')
+ assert code == 1
+ assert PROMPT_PATTERN in stderr
+ assert FIRST_CHECK_FAILED_PATTERN in stdout
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_no_yes(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ [], ["needs" + test_type.capitalize()], b'n\ny\n')
+ assert code == 0
+
+ assert PROMPT_PATTERN in stderr
+ assert FIRST_CHECK_FAILED_PATTERN in stdout
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_allow(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ [], ["needs" + test_type.capitalize()], b'a\n')
+ assert code == 0
+ assert PROMPT_PATTERN in stderr
+ assert FIRST_CHECK_FAILED_PATTERN not in stdout
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+ def test_deny(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ [], ["needs" + test_type.capitalize()], b'd\n')
+ assert code == 1
+ assert PROMPT_PATTERN in stderr
+ assert FIRST_CHECK_FAILED_PATTERN in stdout
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_unrecognized_option(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ [], ["needs" + test_type.capitalize()], b'e\na\n')
+ assert code == 0
+ assert PROMPT_PATTERN in stderr
+ assert FIRST_CHECK_FAILED_PATTERN not in stdout
+ assert PERMISSION_DENIED_PATTERN not in stderr
+ assert b'Unrecognized option' in stderr
+
+ def test_no_prompt(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ ["--no-prompt"], ["needs" + test_type.capitalize()], b'')
+ assert code == 1
+ assert PROMPT_PATTERN not in stderr
+ assert FIRST_CHECK_FAILED_PATTERN in stdout
+ assert PERMISSION_DENIED_PATTERN in stderr
+
+ def test_no_prompt_allow(self):
+ test_type = self.test_type
+ code, stdout, stderr = self._run_deno(
+ ["--no-prompt", "--allow-" + test_type],
+ ["needs" + test_type.capitalize()], b'')
+ assert code == 0
+ assert PROMPT_PATTERN not in stderr
+ assert FIRST_CHECK_FAILED_PATTERN not in stdout
+ assert PERMISSION_DENIED_PATTERN not in stderr
+
+
+class ReadPromptTest(DenoTestCase, BasePromptTest):
+ test_type = "read"
+
+
+class WritePromptTest(DenoTestCase, BasePromptTest):
+ test_type = "write"
+
+
+class EnvPromptTest(DenoTestCase, BasePromptTest):
+ test_type = "env"
+
+
+class NetPromptTest(DenoTestCase, BasePromptTest):
+ test_type = "net"
+
+
+class RunPromptTest(DenoTestCase, BasePromptTest):
+ test_type = "run"
+
+
+def permission_prompt_tests():
+ return BasePromptTest.__subclasses__()
+
+
+if __name__ == "__main__":
+ run_tests()
diff --git a/tools/permission_prompt_test.ts b/tools/permission_prompt_test.ts
new file mode 100644
index 000000000..da0c986ed
--- /dev/null
+++ b/tools/permission_prompt_test.ts
@@ -0,0 +1,67 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+const { args, env, exit, makeTempDirSync, readFileSync, run } = Deno;
+
+const firstCheckFailedMessage = "First check failed";
+
+const name = args[1];
+const test = {
+ async needsRead(): Promise<void> {
+ try {
+ readFileSync("package.json");
+ } catch (e) {
+ console.log(firstCheckFailedMessage);
+ }
+ readFileSync("package.json");
+ },
+ needsWrite(): void {
+ try {
+ makeTempDirSync();
+ } catch (e) {
+ console.log(firstCheckFailedMessage);
+ }
+ makeTempDirSync();
+ },
+ needsEnv(): void {
+ try {
+ env().home;
+ } catch (e) {
+ console.log(firstCheckFailedMessage);
+ }
+ env().home;
+ },
+ needsNet(): void {
+ try {
+ Deno.listen({ hostname: "127.0.0.1", port: 4540 });
+ } catch (e) {
+ console.log(firstCheckFailedMessage);
+ }
+ Deno.listen({ hostname: "127.0.0.1", port: 4541 });
+ },
+ needsRun(): void {
+ try {
+ run({
+ args: [
+ "python",
+ "-c",
+ "import sys; sys.stdout.write('hello'); sys.stdout.flush()"
+ ]
+ });
+ } catch (e) {
+ console.log(firstCheckFailedMessage);
+ }
+ run({
+ args: [
+ "python",
+ "-c",
+ "import sys; sys.stdout.write('hello'); sys.stdout.flush()"
+ ]
+ });
+ }
+}[name];
+
+if (!test) {
+ console.log("Unknown test:", name);
+ exit(1);
+}
+
+test();
diff --git a/tools/repl_test.py b/tools/repl_test.py
new file mode 100644
index 000000000..544dd6a7e
--- /dev/null
+++ b/tools/repl_test.py
@@ -0,0 +1,183 @@
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+from subprocess import CalledProcessError, PIPE, Popen
+import sys
+import time
+
+from test_util import DenoTestCase, run_tests
+
+
+class TestRepl(DenoTestCase):
+ def input(self, *lines, **kwargs):
+ exit_ = kwargs.pop("exit", True)
+ sleep_ = kwargs.pop("sleep", 0)
+ env_ = kwargs.pop("env", None)
+ p = Popen([self.deno_exe],
+ stdout=PIPE,
+ stderr=PIPE,
+ stdin=PIPE,
+ env=env_)
+ try:
+ # Note: The repl takes a >100ms until it's ready.
+ time.sleep(sleep_)
+ for line in lines:
+ p.stdin.write(line.encode("utf-8") + b'\n')
+ p.stdin.flush()
+ time.sleep(sleep_)
+ if exit_:
+ p.stdin.write(b'Deno.exit(0)\n')
+ else:
+ time.sleep(1) # wait to be killed by js
+ out, err = p.communicate()
+ except CalledProcessError as e:
+ p.kill()
+ p.wait()
+ raise e
+ retcode = p.poll()
+ # Ignore Windows CRLF (\r\n).
+ return out.replace('\r\n', '\n'), err.replace('\r\n', '\n'), retcode
+
+ def test_console_log(self):
+ out, err, code = self.input("console.log('hello')", "'world'")
+ self.assertEqual(out, 'hello\nundefined\nworld\n')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_eof(self):
+ out, err, code = self.input("1 + 2", exit=False)
+ self.assertEqual(out, '3\n')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_exit_command(self):
+ out, err, code = self.input("exit", "'ignored'", exit=False)
+ self.assertEqual(out, '')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_help_command(self):
+ out, err, code = self.input("help")
+ expectedOut = '\n'.join([
+ "_ Get last evaluation result",
+ "_error Get last thrown error",
+ "exit Exit the REPL",
+ "help Print this help message",
+ "",
+ ])
+ self.assertEqual(out, expectedOut)
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_function(self):
+ out, err, code = self.input("Deno.writeFileSync")
+ self.assertEqual(out, '[Function: writeFileSync]\n')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_multiline(self):
+ out, err, code = self.input("(\n1 + 2\n)")
+ self.assertEqual(out, '3\n')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ # This should print error instead of wait for input
+ def test_eval_unterminated(self):
+ out, err, code = self.input("eval('{')")
+ self.assertEqual(out, '')
+ assert "Unexpected end of input" in err
+ self.assertEqual(code, 0)
+
+ def test_reference_error(self):
+ out, err, code = self.input("not_a_variable")
+ self.assertEqual(out, '')
+ assert "not_a_variable is not defined" in err
+ self.assertEqual(code, 0)
+
+ # def test_set_timeout(self):
+ # out, err, code = self.input(
+ # "setTimeout(() => { console.log('b'); Deno.exit(0); }, 1)",
+ # "'a'",
+ # exit=False)
+ # self.assertEqual(out, '1\na\nb\n')
+ # self.assertEqual(err, '')
+ # self.assertEqual(code, 0)
+
+ # def test_set_timeout_interlaced(self):
+ # out, err, code = self.input(
+ # "setTimeout(() => console.log('a'), 1)",
+ # "setTimeout(() => console.log('b'), 6)",
+ # sleep=0.8)
+ # self.assertEqual(out, '1\n2\na\nb\n')
+ # self.assertEqual(err, '')
+ # self.assertEqual(code, 0)
+
+ # def test_async_op(self):
+ # out, err, code = self.input(
+ # "fetch('http://localhost:4545/tests/001_hello.js')" +
+ # ".then(res => res.text()).then(console.log)",
+ # sleep=1)
+ # self.assertEqual(out, 'Promise {}\nconsole.log("Hello World");\n\n')
+ # self.assertEqual(err, '')
+ # self.assertEqual(code, 0)
+
+ def test_syntax_error(self):
+ out, err, code = self.input("syntax error")
+ self.assertEqual(out, '')
+ assert "Unexpected identifier" in err
+ self.assertEqual(code, 0)
+
+ def test_type_error(self):
+ out, err, code = self.input("console()")
+ self.assertEqual(out, '')
+ assert "console is not a function" in err
+ self.assertEqual(code, 0)
+
+ def test_variable(self):
+ out, err, code = self.input("var a = 123;", "a")
+ self.assertEqual(out, 'undefined\n123\n')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_lexical_scoped_variable(self):
+ out, err, code = self.input("let a = 123;", "a")
+ self.assertEqual(out, 'undefined\n123\n')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_missing_deno_dir(self):
+ new_env = os.environ.copy()
+ new_env["DENO_DIR"] = os.path.abspath("doesnt_exist")
+ out, err, code = self.input("'noop'", exit=False, env=new_env)
+ self.assertEqual(out, "noop\n")
+ self.assertTrue(err.startswith("Unable to save REPL history:"))
+ self.assertEqual(code, 0)
+
+ def test_save_last_eval(self):
+ out, err, code = self.input("1", "_")
+ self.assertEqual(out, '1\n1\n')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_save_last_thrown(self):
+ out, err, code = self.input("throw 1", "_error")
+ self.assertEqual(out, '1\n')
+ self.assertEqual(err, 'Thrown: 1\n')
+ self.assertEqual(code, 0)
+
+ def test_assign_underscore(self):
+ out, err, code = self.input("_ = 1", "2", "_")
+ self.assertEqual(
+ out, 'Last evaluation result is no longer saved to _.\n1\n2\n1\n')
+ self.assertEqual(err, '')
+ self.assertEqual(code, 0)
+
+ def test_assign_underscore_error(self):
+ out, err, code = self.input("_error = 1", "throw 2", "_error")
+ self.assertEqual(
+ out, 'Last thrown error is no longer saved to _error.\n1\n1\n')
+ self.assertEqual(err, 'Thrown: 2\n')
+ self.assertEqual(code, 0)
+
+
+if __name__ == "__main__":
+ run_tests()
diff --git a/tools/run_node.py b/tools/run_node.py
new file mode 100755
index 000000000..86e7a15b0
--- /dev/null
+++ b/tools/run_node.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+"""
+gn can only run python scripts. This launches a subprocess Node process.
+The working dir of this program is out/Debug/ (AKA root_build_dir)
+Before running node, we symlink js/node_modules to out/Debug/node_modules.
+"""
+import sys
+from os import path
+from util import symlink, root_path, run
+
+if not path.exists("node_modules"):
+ target_abs = path.join(root_path, "third_party/node_modules")
+ target_rel = path.relpath(target_abs)
+ symlink(target_rel, "node_modules", True)
+
+run(["node"] + sys.argv[1:], quiet=True)
diff --git a/tools/setup.py b/tools/setup.py
new file mode 100755
index 000000000..e18b5ffd3
--- /dev/null
+++ b/tools/setup.py
@@ -0,0 +1,185 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import re
+import sys
+from distutils.spawn import find_executable
+import argparse
+import third_party
+from util import build_mode, build_path, enable_ansi_colors, libdeno_path
+from util import shell_quote, root_path, run, third_party_path
+
+parser = argparse.ArgumentParser()
+parser.add_argument(
+ "--no-binary-download",
+ help="Do not download binaries, must use depot_tools manually",
+ action="store_true")
+
+
+def main():
+ enable_ansi_colors()
+ os.chdir(root_path)
+
+ args = parser.parse_args()
+
+ if args.no_binary_download:
+ print "no binary download"
+ else:
+ print "binary download"
+ third_party.download_gn()
+ third_party.download_clang_format()
+ third_party.download_clang()
+ third_party.download_sccache()
+ third_party.maybe_download_sysroot()
+
+ write_lastchange()
+
+ mode = build_mode(default=None)
+ if mode is not None:
+ gn_gen(mode)
+ else:
+ gn_gen("release")
+ gn_gen("debug")
+
+
+def write_if_not_exists(filename, contents):
+ if not os.path.exists(filename):
+ with open(filename, "w+") as f:
+ f.write(contents)
+
+
+def write_lastchange():
+ lastchange_file = os.path.join(libdeno_path, "build", "util", "LASTCHANGE")
+ committime_file = lastchange_file + ".committime"
+ write_if_not_exists(
+ lastchange_file,
+ "LASTCHANGE=c42e4ddbb7973bfb0c57a49ab6bf6dc432baad7e-\n")
+ write_if_not_exists(committime_file, "1535518087")
+ # TODO Properly we should call the following script, but it seems to cause
+ # a rebuild on every commit.
+ # run([
+ # sys.executable, "build/util/lastchange.py", "-o", lastchange_file,
+ # "--source-dir", root_path, "--filter="
+ # ])
+
+
+# If this text is found in args.gn, we assume it hasn't been hand edited.
+gn_args_header = [
+ "# This file is automatically generated by tools/setup.py.",
+ "# REMOVE THIS LINE to preserve any changes you make.", ""
+]
+
+
+def gn_string(s):
+ # In gn, strings are enclosed in double-quotes and use backslash as the
+ # escape character. The only escape sequences supported are:
+ # \" (for literal quote)
+ # \$ (for literal dollars sign)
+ # \\ (for literal backslash)
+ # Any other use of a backslash is treated as a literal backslash.
+ s = re.sub(r'("|\$|\\(?=["$\\]))', r'\\\1', s)
+ s = '"' + s + '"'
+ return s
+
+
+def gn_args_are_generated(lines):
+ for line in lines:
+ if re.match("^\s*#.*REMOVE THIS LINE", line):
+ return True
+ return False
+
+
+def read_gn_args(args_filename):
+ if not os.path.exists(args_filename):
+ return (None, False) # No content, not hand edited.
+
+ with open(args_filename) as f:
+ lines = f.read().splitlines()
+ args = [l.strip() for l in lines if not re.match("^\s*(#|$)", l)]
+ hand_edited = not gn_args_are_generated(lines)
+ return (args, hand_edited)
+
+
+def write_gn_args(args_filename, args):
+ assert not gn_args_are_generated(args) # No header -> hand crafted.
+ lines = gn_args_header + args
+ assert gn_args_are_generated(lines) # With header -> generated.
+
+ # Ensure the directory where args.gn goes exists.
+ d = os.path.dirname(args_filename)
+ if not os.path.isdir(d):
+ os.makedirs(d)
+
+ with open(args_filename, "w") as f:
+ f.write("\n".join(lines) + "\n")
+
+
+def generate_gn_args(mode):
+ out = []
+ if mode == "release":
+ out += ["is_official_build=true", "symbol_level=0"]
+ elif mode == "debug":
+ out += ["is_debug=true"]
+ else:
+ print "Bad mode {}. Use 'release' or 'debug' (default)" % mode
+ sys.exit(1)
+
+ if "DENO_BUILD_ARGS" in os.environ:
+ out += os.environ["DENO_BUILD_ARGS"].split()
+
+ # Check if sccache is in the path, and if so we set cc_wrapper.
+ cc_wrapper = find_executable("sccache")
+ if not cc_wrapper:
+ cc_wrapper = third_party.get_prebuilt_tool_path("sccache")
+
+ if os.path.exists(cc_wrapper):
+ # The gn toolchain does not shell escape cc_wrapper, so do it here.
+ out += ['cc_wrapper=%s' % gn_string(shell_quote(cc_wrapper))]
+ if os.name == "nt":
+ # Disable treat_warnings_as_errors until this sccache bug is fixed:
+ # https://github.com/mozilla/sccache/issues/264
+ out += ["treat_warnings_as_errors=false"]
+
+ return out
+
+
+def gn_exe():
+ if "DENO_GN_PATH" in os.environ:
+ return os.environ["DENO_GN_PATH"]
+ else:
+ return third_party.get_buildtools_tool_path("gn")
+
+
+# gn gen.
+def gn_gen(mode):
+ os.environ["DENO_BUILD_MODE"] = mode
+
+ # Rather than using gn gen --args we write directly to the args.gn file.
+ # This is to avoid quoting/escaping complications when passing overrides as
+ # command-line arguments.
+ args_filename = os.path.join(build_path(), "args.gn")
+
+ # Check if args.gn exists, and if it was auto-generated or handcrafted.
+ existing_gn_args, hand_edited = read_gn_args(args_filename)
+
+ # If args.gn wasn't handcrafted, regenerate it.
+ if hand_edited:
+ print "%s: Using gn options from hand edited '%s'." % (mode,
+ args_filename)
+ gn_args = existing_gn_args
+ else:
+ print "%s: Writing gn options to '%s'." % (mode, args_filename)
+ gn_args = generate_gn_args(mode)
+ if gn_args != existing_gn_args:
+ write_gn_args(args_filename, gn_args)
+
+ for line in gn_args:
+ print " " + line
+
+ run([gn_exe(), "gen", build_path()],
+ cwd=libdeno_path,
+ env=third_party.google_env())
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tools/setup_test.py b/tools/setup_test.py
new file mode 100644
index 000000000..275c53e30
--- /dev/null
+++ b/tools/setup_test.py
@@ -0,0 +1,64 @@
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import sys
+from shutil import rmtree
+from tempfile import mktemp
+from setup import gn_string, read_gn_args, write_gn_args
+from test_util import DenoTestCase, run_tests
+
+
+class TestSetup(DenoTestCase):
+ def test_gn_string(self):
+ assert gn_string('abc') == '"abc"'
+ assert gn_string('foo$bar"baz') == '"foo\\$bar\\"baz"'
+ assert gn_string('do\\not\\escape') == '"do\\not\\escape"'
+ assert gn_string('so\\\\very\\"fun\\') == '"so\\\\\\very\\\\\\"fun\\"'
+
+ def test_read_gn_args(self):
+ # Args file doesn't exist.
+ (args,
+ hand_edited) = read_gn_args("/baddir/hopefully/nonexistent/args.gn")
+ assert args is None
+ assert not hand_edited
+
+ # Handwritten empty args file.
+ filename = mktemp()
+ with open(filename, "w"):
+ pass
+ (args, hand_edited) = read_gn_args(filename)
+ os.remove(filename)
+ assert args == []
+ assert hand_edited
+
+ # Handwritten non-empty args file.
+ expect_args = ['some_number=2', 'another_string="ran/dom#yes"']
+ filename = mktemp()
+ with open(filename, "w") as f:
+ f.write("\n".join(expect_args + ["", "# A comment to be ignored"]))
+ (args, hand_edited) = read_gn_args(filename)
+ os.remove(filename)
+ assert args == expect_args
+ assert hand_edited
+
+ def test_write_gn_args(self):
+ # Build a nonexistent path; write_gn_args() should call mkdir as needed.
+ d = mktemp()
+ filename = os.path.join(d, "args.gn")
+ assert not os.path.exists(d)
+ assert not os.path.exists(filename)
+ # Write some args.
+ args = ['lalala=42', 'foo_bar_baz="lorem ipsum dolor#amet"']
+ write_gn_args(filename, args)
+ # Directory and args file should now be created.
+ assert os.path.isdir(d)
+ assert os.path.isfile(filename)
+ # Validate that the right contents were written.
+ (check_args, hand_edited) = read_gn_args(filename)
+ assert check_args == args
+ assert not hand_edited
+ # Clean up.
+ rmtree(d)
+
+
+if __name__ == '__main__':
+ run_tests()
diff --git a/tools/sha256sum.py b/tools/sha256sum.py
new file mode 100644
index 000000000..99ca283b1
--- /dev/null
+++ b/tools/sha256sum.py
@@ -0,0 +1,70 @@
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+"""
+Computes the SHA256 hash and formats the result.
+"""
+
+import argparse
+from hashlib import sha256
+import os
+import sys
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+
+ # Arguments specifying where input comes from.
+ # If multiple sources are specified, they are all concatenated together.
+ parser.add_argument(
+ "--input",
+ action="append",
+ dest="input",
+ type=str,
+ metavar="TEXT",
+ help="Hash literal text specified on the command line.")
+ parser.add_argument(
+ "--infile",
+ action="append",
+ dest="input",
+ type=read_file,
+ metavar="FILE",
+ help="Hash the contents of a file.")
+
+ # Arguments dealing with output.
+ parser.add_argument(
+ "--format",
+ type=str,
+ dest="format",
+ default="%s",
+ metavar="TEMPLATE",
+ help="Format output using Python template (default = '%%s').")
+ parser.add_argument(
+ "--outfile",
+ dest="outfile",
+ type=argparse.FileType("wb"),
+ default=sys.stdout,
+ metavar="FILE",
+ help="Write the formatted hash to a file (default = stdout).")
+
+ # Parse arguments. Print usage and exit if given no input.
+ args = parser.parse_args()
+ if (not args.input):
+ parser.print_usage()
+ return 1
+
+ # Compute the hash of all inputs concatenated together.
+ hasher = sha256()
+ for data in args.input:
+ hasher.update(data)
+ h = hasher.hexdigest()
+
+ # Format and write to specified out file (or the default, stdout).
+ args.outfile.write(args.format % h)
+
+
+def read_file(filename):
+ with open(filename, "rb") as f:
+ return f.read()
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tools/sync_gclient.py b/tools/sync_gclient.py
new file mode 100755
index 000000000..5da301359
--- /dev/null
+++ b/tools/sync_gclient.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Run this script if you are changing //gclient_config.py
+# To update the deno_third_party git repo after running this, try the following:
+# cd third_party
+# find v8 -type f | grep -v "\.git" | \
+# xargs -I% git add -f --no-warn-embedded-repo "%"
+
+import third_party
+import util
+
+util.enable_ansi_colors()
+third_party.run_gclient_sync()
diff --git a/tools/sync_node_modules.py b/tools/sync_node_modules.py
new file mode 100755
index 000000000..5c5705d9a
--- /dev/null
+++ b/tools/sync_node_modules.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import third_party
+import util
+util.enable_ansi_colors()
+third_party.run_yarn()
diff --git a/tools/sync_python_modules.py b/tools/sync_python_modules.py
new file mode 100755
index 000000000..0a40740f0
--- /dev/null
+++ b/tools/sync_python_modules.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import third_party
+import util
+util.enable_ansi_colors()
+third_party.run_pip()
diff --git a/tools/target_test.py b/tools/target_test.py
new file mode 100644
index 000000000..724dacdec
--- /dev/null
+++ b/tools/target_test.py
@@ -0,0 +1,56 @@
+import os
+import sys
+
+from test_util import DenoTestCase, run_tests
+from util import build_mode, executable_suffix, tests_path, run, run_output
+
+
+class TestTarget(DenoTestCase):
+ @staticmethod
+ def check_exists(filename):
+ if not os.path.exists(filename):
+ print "Required target doesn't exist:", filename
+ sys.exit(1)
+
+ def test_executable_exists(self):
+ self.check_exists(self.deno_exe)
+
+ def _test(self, executable):
+ "Test executable runs and exits with code 0."
+ bin_file = os.path.join(self.build_dir, executable + executable_suffix)
+ self.check_exists(bin_file)
+ run([bin_file], quiet=True)
+
+ def test_libdeno(self):
+ self._test("libdeno_test")
+
+ def test_no_color(self):
+ t = os.path.join(tests_path, "no_color.js")
+ result = run_output([self.deno_exe, "run", t],
+ merge_env={"NO_COLOR": "1"},
+ quiet=True)
+ assert result.out.strip() == "noColor true"
+ t = os.path.join(tests_path, "no_color.js")
+ result = run_output([self.deno_exe, "run", t], quiet=True)
+ assert result.out.strip() == "noColor false"
+
+ def test_exec_path(self):
+ cmd = [
+ self.deno_exe, "run", "--allow-run", "--allow-env",
+ "tests/exec_path.ts"
+ ]
+ result = run_output(cmd, quiet=True)
+ print "exec_path", result
+ self.assertEqual(result.code, 0)
+ if os.name == "nt":
+ # When running in github actions, the windows drive letter of the
+ # executable path reported by deno has a different case than the one
+ # reported by python.
+ assert self.deno_exe.upper() in result.out.strip().upper()
+ assert self.deno_exe[1:] in result.out.strip()
+ else:
+ assert self.deno_exe in result.out.strip()
+
+
+if __name__ == "__main__":
+ run_tests()
diff --git a/tools/test_format.py b/tools/test_format.py
new file mode 100755
index 000000000..c45e0861e
--- /dev/null
+++ b/tools/test_format.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+# This program fails if ./tools/format.py changes any files.
+
+import sys
+import subprocess
+import util
+
+
+def main():
+ util.run([sys.executable, "tools/format.py"])
+ result = util.run_output(
+ ["git", "status", "-uno", "--porcelain", "--ignore-submodules"],
+ exit_on_fail=True)
+ if result.out:
+ print "Run tools/format.py "
+ print result.out
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/test_util.py b/tools/test_util.py
new file mode 100644
index 000000000..6540f37aa
--- /dev/null
+++ b/tools/test_util.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Runs the full test suite.
+# Usage: ./tools/test.py out/Debug
+import argparse
+import contextlib
+import os
+import sys
+import unittest
+
+from util import (enable_ansi_colors, build_path, RESET, FG_RED, FG_GREEN,
+ executable_suffix, rmtree, tests_path)
+
+
+class DenoTestCase(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ args = parse_test_args()
+
+ cls.build_dir = args.build_dir
+ cls.deno_exe = args.executable
+
+
+# overload the test result class
+class ColorTextTestResult(unittest.TextTestResult):
+ @contextlib.contextmanager
+ def color(self, code):
+ self.stream.write(code)
+ try:
+ yield
+ finally:
+ self.stream.write(RESET)
+
+ def getDescription(self, test):
+ name = str(test)
+ if name.startswith("test_"):
+ name = name[5:]
+ return name
+
+ def addSuccess(self, test):
+ with self.color(FG_GREEN):
+ super(ColorTextTestResult, self).addSuccess(test)
+
+ def addError(self, test, err):
+ with self.color(FG_RED):
+ super(ColorTextTestResult, self).addError(test, err)
+
+ def addFailure(self, test, err):
+ with self.color(FG_RED):
+ super(ColorTextTestResult, self).addFailure(test, err)
+
+
+class ColorTextTestRunner(unittest.TextTestRunner):
+ resultclass = ColorTextTestResult
+
+
+def create_test_arg_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ '--failfast', '-f', action='store_true', help='Stop on first failure')
+ parser.add_argument(
+ '--verbose', '-v', action='store_true', help='Verbose output')
+ parser.add_argument("--executable", help="Use external executable of Deno")
+ parser.add_argument(
+ '--release',
+ action='store_true',
+ help='Test against release executable')
+ parser.add_argument(
+ '--pattern', '-p', help='Run tests that match provided pattern')
+ parser.add_argument(
+ '--build-dir', dest="build_dir", help='Deno build directory')
+ return parser
+
+
+TestArgParser = create_test_arg_parser()
+
+
+def parse_test_args(argv=None):
+ if argv is None:
+ argv = sys.argv[1:]
+
+ args = TestArgParser.parse_args(argv)
+
+ if args.executable and args.release:
+ raise argparse.ArgumentError(
+ None, "Path to executable is inferred from "
+ "--release, cannot provide both.")
+
+ if not args.build_dir:
+ args.build_dir = build_path()
+
+ if not args.executable:
+ args.executable = os.path.join(args.build_dir,
+ "deno" + executable_suffix)
+
+ if not os.path.isfile(args.executable):
+ raise argparse.ArgumentError(
+ None, "deno executable not found at {}".format(args.executable))
+
+ return args
+
+
+def filter_test_suite(suite, pattern):
+ filtered_tests = []
+
+ for test_case in suite:
+ if isinstance(test_case, unittest.TestSuite):
+ filtered_tests += filter_test_suite(test_case, pattern)
+ else:
+ if pattern in str(test_case):
+ filtered_tests.append(test_case)
+
+ return filtered_tests
+
+
+def run_tests(test_cases=None):
+ args = parse_test_args()
+
+ loader = unittest.TestLoader()
+
+ # if suite was not explicitly passed load test
+ # cases from calling module
+ if test_cases is None:
+ import __main__
+ suite = loader.loadTestsFromModule(__main__)
+ else:
+ suite = unittest.TestSuite()
+ for test_case in test_cases:
+ suite.addTests(loader.loadTestsFromTestCase(test_case))
+
+ if args.pattern:
+ filtered_tests = filter_test_suite(suite, args.pattern)
+ suite = unittest.TestSuite(filtered_tests)
+
+ runner = ColorTextTestRunner(
+ verbosity=args.verbose + 2, failfast=args.failfast)
+
+ result = runner.run(suite)
+ if not result.wasSuccessful():
+ sys.exit(1)
diff --git a/tools/testdata/strace_summary.out b/tools/testdata/strace_summary.out
new file mode 100644
index 000000000..7984b175a
--- /dev/null
+++ b/tools/testdata/strace_summary.out
@@ -0,0 +1,39 @@
+% time seconds usecs/call calls errors syscall
+------ ----------- ----------- --------- --------- ----------------
+ 65.76 0.005881 98 60 munmap
+ 13.79 0.001233 2 462 mprotect
+ 7.13 0.000638 11 56 mmap
+ 3.57 0.000319 22 14 openat
+ 1.65 0.000148 10 14 fstat
+ 1.58 0.000141 7 20 read
+ 1.53 0.000137 7 18 close
+ 1.49 0.000133 16 8 madvise
+ 1.10 0.000098 98 1 execve
+ 0.30 0.000027 9 3 prctl
+ 0.29 0.000026 26 1 1 access
+ 0.25 0.000022 11 2 2 mkdir
+ 0.23 0.000021 7 3 write
+ 0.18 0.000016 4 4 set_robust_list
+ 0.16 0.000014 7 2 brk
+ 0.15 0.000013 13 1 pipe2
+ 0.11 0.000010 3 3 clone
+ 0.11 0.000010 3 3 sigaltstack
+ 0.10 0.000009 4 2 stat
+ 0.10 0.000009 9 1 arch_prctl
+ 0.10 0.000009 9 1 epoll_create1
+ 0.09 0.000008 8 1 epoll_ctl
+ 0.08 0.000007 3 2 getrandom
+ 0.04 0.000004 4 1 getcwd
+ 0.04 0.000004 2 2 sched_getaffinity
+ 0.03 0.000003 3 1 1 ioctl
+ 0.03 0.000003 1 3 futex
+ 0.00 0.000000 0 1 open
+ 0.00 0.000000 0 5 rt_sigaction
+ 0.00 0.000000 0 1 rt_sigprocmask
+ 0.00 0.000000 0 1 fcntl
+ 0.00 0.000000 0 1 1 readlink
+ 0.00 0.000000 0 1 set_tid_address
+ 0.00 0.000000 0 3 epoll_wait
+ 0.00 0.000000 0 2 prlimit64
+------ ----------- ----------- --------- --------- ----------------
+100.00 0.008943 704 5 total
diff --git a/tools/testdata/time.out b/tools/testdata/time.out
new file mode 100644
index 000000000..3ff409bd7
--- /dev/null
+++ b/tools/testdata/time.out
@@ -0,0 +1,18 @@
+Hello
+ Command being timed: "./target/debug/deno tests/003_relative_import.ts"
+ User time (seconds): 2.43
+ System time (seconds): 0.05
+ Percent of CPU this job got: 156%
+ Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.59
+ Average shared text size (kbytes): 0
+ Average unshared data size (kbytes): 0
+ Average stack size (kbytes): 0
+ Average total size (kbytes): 0
+ Maximum resident set size (kbytes): 120380
+ Average resident set size (kbytes): 0
+ Major (requiring I/O) page faults: 0
+ Minor (reclaiming a frame) page faults: 41452
+ Voluntary context switches: 75
+ Involuntary context switches: 42
+ Swaps: 0
+ File system inputs: 0 \ No newline at end of file
diff --git a/tools/testdata/travis_benchmark.json b/tools/testdata/travis_benchmark.json
new file mode 100644
index 000000000..76fe3173f
--- /dev/null
+++ b/tools/testdata/travis_benchmark.json
@@ -0,0 +1,3059 @@
+{
+ "builds": [
+ {
+ "id": 88053256,
+ "repository_id": 4647767,
+ "commit_id": 142218266,
+ "number": "3226",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Add repl",
+ "pull_request_number": 998,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "errored",
+ "started_at": "2018-10-16T06:02:26Z",
+ "finished_at": "2018-10-16T06:02:59Z",
+ "duration": 47,
+ "job_ids": [152008528, 152008529]
+ },
+ {
+ "id": 88039269,
+ "repository_id": 4647767,
+ "commit_id": 142188592,
+ "number": "3224",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "`deno -v` should report typescript version",
+ "pull_request_number": 995,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-16T01:24:11Z",
+ "finished_at": "2018-10-16T01:32:43Z",
+ "duration": 980,
+ "job_ids": [151979421, 151979422]
+ },
+ {
+ "id": 88038776,
+ "repository_id": 4647767,
+ "commit_id": 142187574,
+ "number": "3223",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "First pass at HTTP req/sec benchmark",
+ "pull_request_number": 996,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\n if [ ! $(which ab) ]; then\n sudo apt-get install apache2-utils\n fi\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-16T01:14:08Z",
+ "finished_at": "2018-10-16T01:23:02Z",
+ "duration": 1047,
+ "job_ids": [151978345, 151978346]
+ },
+ {
+ "id": 88037765,
+ "repository_id": 4647767,
+ "commit_id": 142185325,
+ "number": "3222",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "`deno -v` should report typescript version",
+ "pull_request_number": 995,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-16T00:54:22Z",
+ "finished_at": "2018-10-16T01:03:53Z",
+ "duration": 1027,
+ "job_ids": [151976108, 151976109]
+ },
+ {
+ "id": 88035921,
+ "repository_id": 4647767,
+ "commit_id": 142181355,
+ "number": "3221",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Inject typescript version from package.json during build through env! (`deno -v`)",
+ "pull_request_number": 997,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "$DENO_BUILD_PATH/deno -v",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-16T00:22:14Z",
+ "finished_at": "2018-10-16T00:31:13Z",
+ "duration": 970,
+ "job_ids": [151972101, 151972102]
+ },
+ {
+ "id": 88035173,
+ "repository_id": 4647767,
+ "commit_id": 142179730,
+ "number": "3220",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Inject typescript version from package.json during build through env! (`deno -v`)",
+ "pull_request_number": 997,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./out/Default/deno -v",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "failed",
+ "started_at": "2018-10-16T00:11:05Z",
+ "finished_at": "2018-10-16T00:19:46Z",
+ "duration": 934,
+ "job_ids": [151970315, 151970316]
+ },
+ {
+ "id": 88034680,
+ "repository_id": 4647767,
+ "commit_id": 142178667,
+ "number": "3219",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Inject typescript version from package.json during build through env! (`deno -v`)",
+ "pull_request_number": 997,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./out/release/deno -v",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "failed",
+ "started_at": "2018-10-16T00:02:53Z",
+ "finished_at": "2018-10-16T00:13:59Z",
+ "duration": 943,
+ "job_ids": [151969208, 151969210]
+ },
+ {
+ "id": 88034308,
+ "repository_id": 4647767,
+ "commit_id": 142177845,
+ "number": "3218",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Inject typescript version from package.json during build through env! (`deno -v`)",
+ "pull_request_number": 997,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T23:56:19Z",
+ "finished_at": "2018-10-16T00:06:01Z",
+ "duration": 1021,
+ "job_ids": [151968442, 151968443]
+ },
+ {
+ "id": 88033114,
+ "repository_id": 4647767,
+ "commit_id": 142175399,
+ "number": "3217",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Inject typescript version from package.json during build through env! (`deno -v`)",
+ "pull_request_number": 997,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T23:39:18Z",
+ "finished_at": "2018-10-15T23:48:27Z",
+ "duration": 993,
+ "job_ids": [151965974, 151965975]
+ },
+ {
+ "id": 88029775,
+ "repository_id": 4647767,
+ "commit_id": 142168152,
+ "number": "3216",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "First pass at HTTP req/sec benchmark",
+ "pull_request_number": 996,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\n if [ ! $(which ab) ]; then\n sudo apt-get install apache2-utils\n fi\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T22:55:48Z",
+ "finished_at": "2018-10-15T23:04:46Z",
+ "duration": 1048,
+ "job_ids": [151958374, 151958378]
+ },
+ {
+ "id": 88028304,
+ "repository_id": 4647767,
+ "commit_id": 142164828,
+ "number": "3215",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "First pass at HTTP req/sec benchmark",
+ "pull_request_number": 996,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\n if [ ! $(which ab) ]; then\n sudo apt-get install apache2-utils\n fi\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T22:36:34Z",
+ "finished_at": "2018-10-15T22:46:01Z",
+ "duration": 1080,
+ "job_ids": [151955204, 151955205]
+ },
+ {
+ "id": 88025400,
+ "repository_id": 4647767,
+ "commit_id": 142158554,
+ "number": "3214",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "First pass at HTTP req/sec benchmark",
+ "pull_request_number": 996,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\n if [ ! $(which wrk) ]; then\n sudo apt-get install wrk\n fi\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "errored",
+ "started_at": "2018-10-15T22:03:14Z",
+ "finished_at": "2018-10-15T22:12:24Z",
+ "duration": 633,
+ "job_ids": [151949214, 151949215]
+ },
+ {
+ "id": 88019352,
+ "repository_id": 4647767,
+ "commit_id": 142143927,
+ "number": "3213",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "First pass at HTTP req/sec benchmark",
+ "pull_request_number": 996,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\n if [ ! $(which wrk) ]; then\n apt-get install wrk\n fi\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "errored",
+ "started_at": "2018-10-15T21:03:30Z",
+ "finished_at": "2018-10-15T21:12:43Z",
+ "duration": 605,
+ "job_ids": [151936265, 151936266]
+ },
+ {
+ "id": 88003226,
+ "repository_id": 4647767,
+ "commit_id": 142108538,
+ "number": "3212",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "`deno -v` should report typescript version",
+ "pull_request_number": 995,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T18:41:34Z",
+ "finished_at": "2018-10-15T18:50:57Z",
+ "duration": 1023,
+ "job_ids": [151902875, 151902876]
+ },
+ {
+ "id": 87995060,
+ "repository_id": 4647767,
+ "commit_id": 142091478,
+ "number": "3209",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Fix a binary size regression",
+ "pull_request_number": 992,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T17:33:47Z",
+ "finished_at": "2018-10-15T17:43:46Z",
+ "duration": 1140,
+ "job_ids": [151886378, 151886379]
+ },
+ {
+ "id": 87988978,
+ "repository_id": 4647767,
+ "commit_id": 142079021,
+ "number": "3207",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Exit cleanly on unrecognized arguments",
+ "pull_request_number": 990,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T16:43:54Z",
+ "finished_at": "2018-10-15T17:12:26Z",
+ "duration": 1957,
+ "job_ids": [151874417, 151874418]
+ },
+ {
+ "id": 87973681,
+ "repository_id": 4647767,
+ "commit_id": 142047284,
+ "number": "3204",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "WIP repl inside deno, initial phase",
+ "pull_request_number": 947,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "failed",
+ "started_at": "2018-10-15T14:59:30Z",
+ "finished_at": "2018-10-15T15:08:01Z",
+ "duration": 978,
+ "job_ids": [151846133, 151846134]
+ },
+ {
+ "id": 87971925,
+ "repository_id": 4647767,
+ "commit_id": 142043639,
+ "number": "3203",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "WIP repl inside deno, initial phase",
+ "pull_request_number": 947,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "failed",
+ "started_at": "2018-10-15T14:49:22Z",
+ "finished_at": "2018-10-15T14:57:42Z",
+ "duration": 948,
+ "job_ids": [151843047, 151843048]
+ },
+ {
+ "id": 87966224,
+ "repository_id": 4647767,
+ "commit_id": 142031738,
+ "number": "3202",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "WIP repl inside deno, initial phase",
+ "pull_request_number": 947,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "errored",
+ "started_at": "2018-10-15T14:14:16Z",
+ "finished_at": "2018-10-15T14:15:10Z",
+ "duration": 47,
+ "job_ids": [151832638, 151832639]
+ },
+ {
+ "id": 87965303,
+ "repository_id": 4647767,
+ "commit_id": 142029715,
+ "number": "3201",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "WIP repl inside deno, initial phase",
+ "pull_request_number": 947,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "errored",
+ "started_at": "2018-10-15T14:07:57Z",
+ "finished_at": "2018-10-15T14:08:44Z",
+ "duration": 43,
+ "job_ids": [151830770, 151830771]
+ },
+ {
+ "id": 87954382,
+ "repository_id": 4647767,
+ "commit_id": 142007106,
+ "number": "3200",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Implement url joining utility function",
+ "pull_request_number": 991,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T12:54:45Z",
+ "finished_at": "2018-10-15T13:03:54Z",
+ "duration": 1022,
+ "job_ids": [151809886, 151809887]
+ },
+ {
+ "id": 87944481,
+ "repository_id": 4647767,
+ "commit_id": 141986531,
+ "number": "3199",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Specify deno_dir location with env var DENO_DIR",
+ "pull_request_number": 970,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T11:33:43Z",
+ "finished_at": "2018-10-15T11:42:25Z",
+ "duration": 990,
+ "job_ids": [151791302, 151791303]
+ },
+ {
+ "id": 87942227,
+ "repository_id": 4647767,
+ "commit_id": 141981706,
+ "number": "3198",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Specify deno_dir location with env var DENO_DIR",
+ "pull_request_number": 970,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T11:13:31Z",
+ "finished_at": "2018-10-15T11:22:13Z",
+ "duration": 1010,
+ "job_ids": [151787197, 151787199]
+ },
+ {
+ "id": 87897848,
+ "repository_id": 4647767,
+ "commit_id": 141887249,
+ "number": "3197",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "Exit cleanly on unrecognized arguments",
+ "pull_request_number": 990,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T01:03:58Z",
+ "finished_at": "2018-10-15T01:12:43Z",
+ "duration": 999,
+ "job_ids": [151701418, 151701419]
+ },
+ {
+ "id": 87896922,
+ "repository_id": 4647767,
+ "commit_id": 141884956,
+ "number": "3196",
+ "event_type": "pull_request",
+ "pull_request": true,
+ "pull_request_title": "better error message from tools/format.py",
+ "pull_request_number": 926,
+ "config": {
+ "dist": "trusty",
+ "cache": {
+ "ccache": true,
+ "directories": [
+ "$CARGO_HOME",
+ "$RUSTUP_HOME",
+ "$HOMEBREW_PATH",
+ "$SCCACHE_DIR",
+ "third_party/v8/build/linux/debian_sid_amd64-sysroot/",
+ "third_party/v8/third_party/llvm-build/"
+ ]
+ },
+ "group": "stable",
+ "deploy": [
+ {
+ "file": "$DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz",
+ "true": { "repo": "denoland/deno", "tags": true },
+ "api_key": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "provider": "releases",
+ "skip-cleanup": true
+ },
+ {
+ "true": {
+ "repo": "denoland/deno",
+ "branch": "master",
+ "condition": "$BENCHMARK == 1"
+ },
+ "provider": "pages",
+ "local-dir": "gh-pages",
+ "github-token": {
+ "secure": "RIwv515oDcPAlEvt7uG8FeSFi6Tz6ODJUOXcFj6FYUPszxJ7Cg1kBLKln+fNW5OeOc52VsaZb/vPZ85skyEM6zk2ijL9FcSnnfNEm548w77iH6G0sk09NgBTy6KRXES6NZHD9jN1YTWYkT2G1NQi7mLqxR8a8pnWTbeK5HhtSWGsZPtXqf5iQbvnWsmKA0/w+FIgKupU0xe/qsYjh0eMLYpZDUWoKO0VxBKJ/ix5Uz91aJTjMIcHHij+ALg4pk+FkDotdyx39XB9b25KDxGuaI7NxWjSPzDxs/ZBHP6QYDLO0ti93ftvLAxRoBKPFoZrXqAu3KG9anr9WvxE40DO9OdV0VX2ZUatMUQm3DpSheN8ml2sErFqjIInqlpkdOVDYORz7FikPxkb9DKt+iuyFfxPRa4YWJv2tg8+Hy/nRCQw69OoKqrSNJ8KJDB3OjYbRBtdHz79RLJhTsGZla6RiyXfM7crR7CbFjbwdbW3Pt60t24fhvXQ0SwR0QTgzS/ieYEQHq/9GtSQA/Tn4kdIkyN6BdOMrQd/aUtgKmNdqbSlfmWGNyNZIxHdB+3RrTNT1tagkRI4UHEUfEujpIdYKwLjv0Xmi/VtTM+zOSkzHsIWGPfHBmIGnXfAItUHqivQYJ15E+dzg3T1CEbBxkDQtvwien9Fa8/pBsMkyovl8ps="
+ },
+ "keep-history": true,
+ "skip-cleanup": true
+ }
+ ],
+ "matrix": {
+ "include": [
+ {
+ "os": "linux",
+ "env": "BENCHMARK=1",
+ "dist": "trusty",
+ "sudo": "required"
+ },
+ { "os": "osx", "dist": "trusty" }
+ ]
+ },
+ "script": [
+ "./tools/lint.py",
+ "bash -c \"sleep 2100; pkill ninja\" \u0026",
+ "./tools/build.py -j2",
+ "./tools/test.py $DENO_BUILD_PATH"
+ ],
+ ".result": "configured",
+ "install": [
+ "nvm install v8",
+ "nvm use --delete-prefix v8",
+ "node -v",
+ "# OS X: install a private copy of homebrew.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n export BREW=\"${HOMEBREW_PATH}bin/brew\"\n export PATH=\"${HOMEBREW_PATH}bin:$PATH\"\n if [[ ! -x \"$BREW\" ]]; then\n git clone git://github.com/homebrew/brew \"$HOMEBREW_PATH\"\n fi\n \"$BREW\" --version\nfi",
+ "# Install ccache (if necessary) and set it up.\nif [[ \"$TRAVIS_OS_NAME\" == \"osx\" \u0026\u0026 ! $(which ccache) ]]; then\n \"$BREW\" install ccache\nfi\nccache --version | head -n 1\nccache --max-size=1G",
+ "# Install Rust.\n# TODO(ry) Include rustc in third_party.\n# https://github.com/denoland/deno/issues/386\nif [ ! $(which rustc) ]; then\n curl -sSf https://sh.rustup.rs | sh -s -- -y\nfi\nrustc --version\ncargo --version",
+ "# Install and start sccache.\nif [ ! $(which sccache) ]; then\n cargo install sccache\nfi\nsccache --version\nsccache --start-server",
+ "# Install hyperfine (if benchmarking is enabled for this build).\nif [ $BENCHMARK ]; then\n if [ ! $(which hyperfine) ]; then\n cargo install hyperfine\n fi\n hyperfine --version\nfi",
+ "# Remove unnnecessary cargo and rustup directories.\n# This keeps the Travis CI cache small and fast.\nrm -rf \"$CARGO_HOME\"registry\nrm -rf \"$RUSTUP_HOME\"downloads\nrm -rf \"$RUSTUP_HOME\"tmp\nrm -rf \"$RUSTUP_HOME\"toolchains/*/etc\nrm -rf \"$RUSTUP_HOME\"toolchains/*/share"
+ ],
+ "language": "c++",
+ "global_env": [
+ "CARGO_HOME=$HOME/.cargo/",
+ "RUSTUP_HOME=$HOME/.rustup/",
+ "RUST_BACKTRACE=1",
+ "HOMEBREW_PATH=$HOME/homebrew/",
+ "DENO_BUILD_ARGS=\"use_custom_libcxx=false use_sysroot=false\"",
+ "DENO_BUILD_PATH=$HOME/out/Default",
+ "DENO_BUILD_MODE=release",
+ "PATH=$TRAVIS_BUILD_DIR/third_party/llvm-build/Release+Asserts/bin:$CARGO_HOME/bin:$PATH",
+ "CCACHE_CPP2=yes",
+ "CCACHE_SLOPPINESS=time_macros",
+ "SCCACHE_DIR=$HOME/.sccache/",
+ "SCCACHE_CACHE_SIZE=1G",
+ "SCCACHE_IDLE_TIMEOUT=0"
+ ],
+ "after_script": ["ccache --show-stats", "sccache --stop-server"],
+ "after_success": [
+ "# Run benchmarks and publish the result to github pages.\nif [ $BENCHMARK ]; then\n ./tools/benchmark.py $DENO_BUILD_PATH \u0026\u0026\n cp -r website/* gh-pages/\nfi\n"
+ ],
+ "before_deploy": [
+ "gzip -c $DENO_BUILD_PATH/deno \u003e $DENO_BUILD_PATH/deno_${TRAVIS_OS_NAME}_x64.gz"
+ ],
+ "before_script": ["./tools/setup.py"]
+ },
+ "state": "passed",
+ "started_at": "2018-10-15T00:34:50Z",
+ "finished_at": "2018-10-15T00:43:33Z",
+ "duration": 984,
+ "job_ids": [151699430, 151699431]
+ }
+ ],
+ "commits": [
+ {
+ "id": 142218266,
+ "sha": "fd73a90539b34ff6eeda5bc5da536e97e7cc1f89",
+ "branch": "master",
+ "tag": null,
+ "message": "Remove old code",
+ "committed_at": "2018-10-16T05:48:46Z",
+ "author_name": "Andy Hayden",
+ "author_email": "andyhayden1@gmail.com",
+ "committer_name": "Andy Hayden",
+ "committer_email": "andyhayden1@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/998",
+ "pull_request_number": 998
+ },
+ {
+ "id": 142188592,
+ "sha": "95486a061161511714af59349c348e96ea92a5f0",
+ "branch": "master",
+ "tag": null,
+ "message": "`deno -v` should report typescript version\n\nFixes #993",
+ "committed_at": "2018-10-16T01:21:36Z",
+ "author_name": "Jinho Bang",
+ "author_email": "zino@chromium.org",
+ "committer_name": "Jinho Bang",
+ "committer_email": "zino@chromium.org",
+ "compare_url": "https://github.com/denoland/deno/pull/995",
+ "pull_request_number": 995
+ },
+ {
+ "id": 142187574,
+ "sha": "f112d1c5cade99ad8446e70982867b636f5443b9",
+ "branch": "master",
+ "tag": null,
+ "message": "First pass at http benchmark.",
+ "committed_at": "2018-10-16T01:13:07Z",
+ "author_name": "Ryan Dahl",
+ "author_email": "ry@tinyclouds.org",
+ "committer_name": "Ryan Dahl",
+ "committer_email": "ry@tinyclouds.org",
+ "compare_url": "https://github.com/denoland/deno/pull/996",
+ "pull_request_number": 996
+ },
+ {
+ "id": 142185325,
+ "sha": "dac5f097445f05ea7bcadcbe4ad4f4ddb251b86a",
+ "branch": "master",
+ "tag": null,
+ "message": "`deno -v` should report typescript version\n\nFixes #993",
+ "committed_at": "2018-10-16T00:52:33Z",
+ "author_name": "Jinho Bang",
+ "author_email": "zino@chromium.org",
+ "committer_name": "Jinho Bang",
+ "committer_email": "zino@chromium.org",
+ "compare_url": "https://github.com/denoland/deno/pull/995",
+ "pull_request_number": 995
+ },
+ {
+ "id": 142181355,
+ "sha": "8e3bc586a27c5471a7d1d92f881a5421be99c380",
+ "branch": "master",
+ "tag": null,
+ "message": "Fix unicode issue; print -v on AppVeyor/Travis",
+ "committed_at": "2018-10-16T00:20:26Z",
+ "author_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "author_email": "kevinkassimo@gmail.com",
+ "committer_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "committer_email": "kevinkassimo@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/997",
+ "pull_request_number": 997
+ },
+ {
+ "id": 142179730,
+ "sha": "69d571858564c191baa665b501851421c3fdf7cb",
+ "branch": "master",
+ "tag": null,
+ "message": "Fix unicode issue; print -v on AppVeyor/Travis",
+ "committed_at": "2018-10-16T00:09:32Z",
+ "author_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "author_email": "kevinkassimo@gmail.com",
+ "committer_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "committer_email": "kevinkassimo@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/997",
+ "pull_request_number": 997
+ },
+ {
+ "id": 142178667,
+ "sha": "df38bae0249730c013661446954497771adec530",
+ "branch": "master",
+ "tag": null,
+ "message": "Debug",
+ "committed_at": "2018-10-16T00:01:02Z",
+ "author_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "author_email": "kevinkassimo@gmail.com",
+ "committer_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "committer_email": "kevinkassimo@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/997",
+ "pull_request_number": 997
+ },
+ {
+ "id": 142177845,
+ "sha": "f73a2e54c18ba86ec0d6ead7744a7ab66d221c12",
+ "branch": "master",
+ "tag": null,
+ "message": "Debug",
+ "committed_at": "2018-10-15T23:55:27Z",
+ "author_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "author_email": "kevinkassimo@gmail.com",
+ "committer_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "committer_email": "kevinkassimo@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/997",
+ "pull_request_number": 997
+ },
+ {
+ "id": 142175399,
+ "sha": "3a0a7aec9874b0d01adca9591adf537587d2777d",
+ "branch": "master",
+ "tag": null,
+ "message": "Inject ts version during build through env",
+ "committed_at": "2018-10-15T23:34:26Z",
+ "author_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "author_email": "kevinkassimo@gmail.com",
+ "committer_name": "Kevin (Kun) \"Kassimo\" Qian",
+ "committer_email": "kevinkassimo@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/997",
+ "pull_request_number": 997
+ },
+ {
+ "id": 142168152,
+ "sha": "06e8f5b6687330c49c8faf0d7da109110326e5e0",
+ "branch": "master",
+ "tag": null,
+ "message": "First pass at http benchmark.",
+ "committed_at": "2018-10-15T22:54:43Z",
+ "author_name": "Ryan Dahl",
+ "author_email": "ry@tinyclouds.org",
+ "committer_name": "Ryan Dahl",
+ "committer_email": "ry@tinyclouds.org",
+ "compare_url": "https://github.com/denoland/deno/pull/996",
+ "pull_request_number": 996
+ },
+ {
+ "id": 142164828,
+ "sha": "1e7d3f81ea9176e8f35dc499e31e2e21ed954fda",
+ "branch": "master",
+ "tag": null,
+ "message": "Use ab instead of wrk (debian doesnt have wrk)",
+ "committed_at": "2018-10-15T22:35:44Z",
+ "author_name": "Ryan Dahl",
+ "author_email": "ry@tinyclouds.org",
+ "committer_name": "Ryan Dahl",
+ "committer_email": "ry@tinyclouds.org",
+ "compare_url": "https://github.com/denoland/deno/pull/996",
+ "pull_request_number": 996
+ },
+ {
+ "id": 142158554,
+ "sha": "793a2bde892e61eadaa07ebe09c8c808db77d7b9",
+ "branch": "master",
+ "tag": null,
+ "message": "First pass at wrk benchmark.",
+ "committed_at": "2018-10-15T22:01:54Z",
+ "author_name": "Ryan Dahl",
+ "author_email": "ry@tinyclouds.org",
+ "committer_name": "Ryan Dahl",
+ "committer_email": "ry@tinyclouds.org",
+ "compare_url": "https://github.com/denoland/deno/pull/996",
+ "pull_request_number": 996
+ },
+ {
+ "id": 142143927,
+ "sha": "326604257421c88db4b07f6a6a32d5bd72efb734",
+ "branch": "master",
+ "tag": null,
+ "message": "First pass at wrk benchmark.",
+ "committed_at": "2018-10-15T21:01:26Z",
+ "author_name": "Ryan Dahl",
+ "author_email": "ry@tinyclouds.org",
+ "committer_name": "Ryan Dahl",
+ "committer_email": "ry@tinyclouds.org",
+ "compare_url": "https://github.com/denoland/deno/pull/996",
+ "pull_request_number": 996
+ },
+ {
+ "id": 142108538,
+ "sha": "4ddb2a80705450abb1c4e038c34dd0ff035356e0",
+ "branch": "master",
+ "tag": null,
+ "message": "`deno -v` should report typescript version\n\nFixes #993",
+ "committed_at": "2018-10-15T18:40:21Z",
+ "author_name": "Jinho Bang",
+ "author_email": "zino@chromium.org",
+ "committer_name": "Jinho Bang",
+ "committer_email": "zino@chromium.org",
+ "compare_url": "https://github.com/denoland/deno/pull/995",
+ "pull_request_number": 995
+ },
+ {
+ "id": 142091478,
+ "sha": "b9e9ac57e4b5727aa0076ba5f5fc7b6215d463fe",
+ "branch": "master",
+ "tag": null,
+ "message": "Fix a binary size regression\n\nThis patch changes Jumbo build to use only in debug mode.",
+ "committed_at": "2018-10-15T17:28:35Z",
+ "author_name": "Jinho Bang",
+ "author_email": "zino@chromium.org",
+ "committer_name": "Jinho Bang",
+ "committer_email": "zino@chromium.org",
+ "compare_url": "https://github.com/denoland/deno/pull/992",
+ "pull_request_number": 992
+ },
+ {
+ "id": 142079021,
+ "sha": "c30b2fd05b9218c476f52439b66ced5afe471e26",
+ "branch": "master",
+ "tag": null,
+ "message": "simplify error message",
+ "committed_at": "2018-10-15T16:42:58Z",
+ "author_name": "Ryan Dahl",
+ "author_email": "ry@tinyclouds.org",
+ "committer_name": "GitHub",
+ "committer_email": "noreply@github.com",
+ "compare_url": "https://github.com/denoland/deno/pull/990",
+ "pull_request_number": 990
+ },
+ {
+ "id": 142047284,
+ "sha": "f6d0de1276aecb5583aba5266205db465fd82598",
+ "branch": "master",
+ "tag": null,
+ "message": "formating",
+ "committed_at": "2018-10-15T14:58:19Z",
+ "author_name": "Shiva Prasanth",
+ "author_email": "kesavararapu.siva@gmail.com",
+ "committer_name": "Shiva Prasanth",
+ "committer_email": "kesavararapu.siva@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/947",
+ "pull_request_number": 947
+ },
+ {
+ "id": 142043639,
+ "sha": "2183fb826cecba6ef8bfb00344156d1ade752c7c",
+ "branch": "master",
+ "tag": null,
+ "message": "adding deno namespace to repl",
+ "committed_at": "2018-10-15T14:12:52Z",
+ "author_name": "Shiva Prasanth",
+ "author_email": "kesavararapu.siva@gmail.com",
+ "committer_name": "Shiva Prasanth",
+ "committer_email": "kesavararapu.siva@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/947",
+ "pull_request_number": 947
+ },
+ {
+ "id": 142031738,
+ "sha": "566d00715d0ff1674ff221689d4f7b4cbb0d2330",
+ "branch": "master",
+ "tag": null,
+ "message": "adding deno namespace to repl",
+ "committed_at": "2018-10-15T14:12:52Z",
+ "author_name": "Shiva Prasanth",
+ "author_email": "kesavararapu.siva@gmail.com",
+ "committer_name": "Shiva Prasanth",
+ "committer_email": "kesavararapu.siva@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/947",
+ "pull_request_number": 947
+ },
+ {
+ "id": 142029715,
+ "sha": "9e815bc6b8eeedec408091b57638bfb9096d43b3",
+ "branch": "master",
+ "tag": null,
+ "message": "thirdParty",
+ "committed_at": "2018-10-15T13:56:03Z",
+ "author_name": "Shiva Prasanth",
+ "author_email": "kesavararapu.siva@gmail.com",
+ "committer_name": "Shiva Prasanth",
+ "committer_email": "kesavararapu.siva@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/947",
+ "pull_request_number": 947
+ },
+ {
+ "id": 142007106,
+ "sha": "5a31e1eaf0a9ce89a19be30babd2048d39fe536d",
+ "branch": "master",
+ "tag": null,
+ "message": "Implement url joining utility function\n\nFixes #955",
+ "committed_at": "2018-10-15T08:22:54Z",
+ "author_name": "Jinho Bang",
+ "author_email": "zino@chromium.org",
+ "committer_name": "Jinho Bang",
+ "committer_email": "jinho.bang@samsung.com",
+ "compare_url": "https://github.com/denoland/deno/pull/991",
+ "pull_request_number": 991
+ },
+ {
+ "id": 141986531,
+ "sha": "7127136928e54c06b775402227cb6480a1dc9d8e",
+ "branch": "master",
+ "tag": null,
+ "message": "Use C:\\deno instead of c:\\deno",
+ "committed_at": "2018-10-15T11:31:48Z",
+ "author_name": "Amos Lim",
+ "author_email": "amoseui@gmail.com",
+ "committer_name": "Amos Lim",
+ "committer_email": "amoseui@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/970",
+ "pull_request_number": 970
+ },
+ {
+ "id": 141981706,
+ "sha": "21c8ce0f1a49ad909fc52ab82cd9b98c1ae02430",
+ "branch": "master",
+ "tag": null,
+ "message": "Let deno_dir_test run deno with or without env DENO_DIR",
+ "committed_at": "2018-10-15T11:08:30Z",
+ "author_name": "Amos Lim",
+ "author_email": "amoseui@gmail.com",
+ "committer_name": "Amos Lim",
+ "committer_email": "amoseui@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/970",
+ "pull_request_number": 970
+ },
+ {
+ "id": 141887249,
+ "sha": "44fc4ce9920340fefdcce3930269cf99dc4369bc",
+ "branch": "master",
+ "tag": null,
+ "message": "Exit cleanly on unrecognized arguments\n\nRefactor set_flags to return a Result",
+ "committed_at": "2018-10-15T00:56:41Z",
+ "author_name": "Andy Hayden",
+ "author_email": "andyhayden1@gmail.com",
+ "committer_name": "Andy Hayden",
+ "committer_email": "andyhayden1@gmail.com",
+ "compare_url": "https://github.com/denoland/deno/pull/990",
+ "pull_request_number": 990
+ },
+ {
+ "id": 141884956,
+ "sha": "d220136bee5c5645da905a6118bb3f0f0c893319",
+ "branch": "master",
+ "tag": null,
+ "message": "formating print",
+ "committed_at": "2018-10-15T00:34:03Z",
+ "author_name": "Shiva Prasanth",
+ "author_email": "kesavarapu.siva@gmail.com",
+ "committer_name": "GitHub",
+ "committer_email": "noreply@github.com",
+ "compare_url": "https://github.com/denoland/deno/pull/926",
+ "pull_request_number": 926
+ }
+ ]
+}
diff --git a/tools/testdata/unit_test_output1.txt b/tools/testdata/unit_test_output1.txt
new file mode 100644
index 000000000..4b208319f
--- /dev/null
+++ b/tools/testdata/unit_test_output1.txt
@@ -0,0 +1,238 @@
+running 96 tests
+test permSerialization_permW0N0E0
+... ok
+test permFromStringThrows_permW0N0E0
+... ok
+test compilerInstance_permW0N0E0
+... ok
+test compilerRun_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerRunMultiModule_permW0N0E0
+... ok
+test compilerRunCircularDependency_permW0N0E0
+Compiling modA
+Compiling modB
+... ok
+test compilerResolveModule_permW0N0E0
+... ok
+test compilerGetModuleDependencies_permW0N0E0
+... ok
+test compilerGetCompilationSettings_permW0N0E0
+... ok
+test compilerGetNewLine_permW0N0E0
+... ok
+test compilerGetScriptFileNames_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerRecompileFlag_permW0N0E0
+Compiling /root/project/foo/bar.ts
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerGetScriptKind_permW0N0E0
+... ok
+test compilerGetScriptVersion_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerGetScriptVersionUnknown_permW0N0E0
+... ok
+test compilerGetScriptSnapshot_permW0N0E0
+... ok
+test compilerGetCurrentDirectory_permW0N0E0
+... ok
+test compilerGetDefaultLibFileName_permW0N0E0
+... ok
+test compilerUseCaseSensitiveFileNames_permW0N0E0
+... ok
+test compilerReadFile_permW0N0E0
+... ok
+test compilerFileExists_permW0N0E0
+... ok
+test compilerResolveModuleNames_permW0N0E0
+... ok
+test consoleTestAssert_permW0N0E0
+... ok
+test consoleTestStringifyComplexObjects_permW0N0E0
+... ok
+test consoleTestStringifyCircular_permW0N0E0
+... ok
+test consoleTestStringifyWithDepth_permW0N0E0
+... ok
+test consoleTestError_permW0N0E0
+... ok
+test consoleDetachedLog_permW0N0E0
+Hello world
+Hello world
+Hello world
+Hello world
+Hello world
+Hello world
+... ok
+test fetchPerm_permW0N0E0
+... ok
+test headersAppend_permW0N0E0
+... ok
+test newHeaderTest_permW0N0E0
+... ok
+test newHeaderWithSequence_permW0N0E0
+... ok
+test newHeaderWithRecord_permW0N0E0
+... ok
+test newHeaderWithHeadersInstance_permW0N0E0
+... ok
+test headerAppendSuccess_permW0N0E0
+... ok
+test headerSetSuccess_permW0N0E0
+... ok
+test headerHasSuccess_permW0N0E0
+... ok
+test headerDeleteSuccess_permW0N0E0
+... ok
+test headerGetSuccess_permW0N0E0
+... ok
+test headerForEachSuccess_permW0N0E0
+... ok
+test envFailure_permW0N0E0
+... ok
+test filesStdioFileDescriptors_permW0N0E0
+... ok
+test filesCopyToStdout_permW0N0E0
+{
+ "name": "deno",
+ "devDependencies": {
+ "@types/base64-js": "^1.2.5",
+ "@types/flatbuffers": "^1.9.0",
+ "@types/source-map-support": "^0.4.1",
+ "@types/text-encoding": "0.0.33",
+ "base64-js": "^1.3.0",
+ "flatbuffers": "^1.9.0",
+ "magic-string": "^0.22.5",
+ "prettier": "^1.14.0",
+ "rollup": "^0.63.2",
+ "rollup-plugin-alias": "^1.4.0",
+ "rollup-plugin-analyzer": "^2.1.0",
+ "rollup-plugin-commonjs": "^9.1.3",
+ "rollup-plugin-node-globals": "^1.2.1",
+ "rollup-plugin-node-resolve": "^3.3.0",
+ "rollup-plugin-string": "^2.0.2",
+ "rollup-plugin-typescript2": "^0.16.1",
+ "rollup-pluginutils": "^2.3.0",
+ "source-map-support": "^0.5.6",
+ "text-encoding": "0.6.4",
+ "tslint": "^5.10.0",
+ "tslint-eslint-rules": "^5.3.1",
+ "tslint-no-circular-imports": "^0.5.0",
+ "typescript": "3.0.3"
+ }
+}
+bytes written 860
+... ok
+test readFileSyncSuccess_permW0N0E0
+... ok
+test readFileSyncNotFound_permW0N0E0
+... ok
+test readFileSuccess_permW0N0E0
+... ok
+test readDirSyncNotDir_permW0N0E0
+... ok
+test readDirSyncNotFound_permW0N0E0
+... ok
+test writeFileSyncPerm_permW0N0E0
+... ok
+test writeFilePerm_permW0N0E0
+... ok
+test copyFileSyncPerm_permW0N0E0
+... ok
+test copyFilePerm_permW0N0E0
+... ok
+test mkdirSyncPerm_permW0N0E0
+... ok
+test makeTempDirSyncPerm_permW0N0E0
+... ok
+test statSyncSuccess_permW0N0E0
+... ok
+test statSyncNotFound_permW0N0E0
+... ok
+test lstatSyncSuccess_permW0N0E0
+... ok
+test lstatSyncNotFound_permW0N0E0
+... ok
+test statSuccess_permW0N0E0
+... ok
+test statNotFound_permW0N0E0
+... ok
+test lstatSuccess_permW0N0E0
+... ok
+test lstatNotFound_permW0N0E0
+... ok
+test renameSyncPerm_permW0N0E0
+... ok
+test readlinkSyncNotFound_permW0N0E0
+... ok
+test blobString_permW0N0E0
+... ok
+test blobBuffer_permW0N0E0
+... ok
+test blobSlice_permW0N0E0
+... ok
+test timeoutSuccess_permW0N0E0
+... ok
+test timeoutArgs_permW0N0E0
+... ok
+test timeoutCancelSuccess_permW0N0E0
+... ok
+test timeoutCancelMultiple_permW0N0E0
+... ok
+test timeoutCancelInvalidSilentFail_permW0N0E0
+... ok
+test intervalSuccess_permW0N0E0
+... ok
+test intervalCancelSuccess_permW0N0E0
+... ok
+test intervalOrdering_permW0N0E0
+... ok
+test intervalCancelInvalidSilentFail_permW0N0E0
+... ok
+test symlinkSyncPerm_permW0N0E0
+... ok
+test platformTransform_permW0N0E0
+... ok
+test atobSuccess_permW0N0E0
+... ok
+test btoaSuccess_permW0N0E0
+... ok
+test btoaFailed_permW0N0E0
+... ok
+test truncateSyncPerm_permW0N0E0
+... ok
+test truncatePerm_permW0N0E0
+... ok
+test evalErrorFormatted_permW0N0E0
+... ok
+test createExecTimeColumnsRegularData_permW0N0E0
+... ok
+test createExecTimeColumnsIrregularData_permW0N0E0
+... ok
+test createBinarySizeColumnsRegularData_permW0N0E0
+... ok
+test createBinarySizeColumnsIrregularData_permW0N0E0
+... ok
+test createThreadCountColumnsRegularData_permW0N0E0
+... ok
+test createThreadCountColumnsIrregularData_permW0N0E0
+... ok
+test createSyscallCountColumnsRegularData_permW0N0E0
+... ok
+test createSyscallCountColumnsIrregularData_permW0N0E0
+... ok
+test createSha1ListRegularData_permW0N0E0
+... ok
+test formatBytesPatterns_permW0N0E0
+... ok
+test formatSecondsPatterns_permW0N0E0
+... ok
+test getTravisDataSuccess_permW0N0E0
+... ok
+
+test result: ok. 96 passed; 0 failed; 0 ignored; 0 measured; 36 filtered out
+
diff --git a/tools/testdata/unit_test_output2.txt b/tools/testdata/unit_test_output2.txt
new file mode 100644
index 000000000..5913d3b90
--- /dev/null
+++ b/tools/testdata/unit_test_output2.txt
@@ -0,0 +1,71 @@
+running 96 tests
+test permSerialization_permW0N0E0
+... ok
+test permFromStringThrows_permW0N0E0
+... ok
+test compilerInstance_permW0N0E0
+... ok
+test compilerRun_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerRunMultiModule_permW0N0E0
+... ok
+test compilerRunCircularDependency_permW0N0E0
+Compiling modA
+Compiling modB
+... ok
+test compilerResolveModule_permW0N0E0
+... ok
+test compilerGetModuleDependencies_permW0N0E0
+... ok
+test compilerGetCompilationSettings_permW0N0E0
+... ok
+test compilerGetNewLine_permW0N0E0
+... ok
+test compilerGetScriptFileNames_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerRecompileFlag_permW0N0E0
+Compiling /root/project/foo/bar.ts
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerGetScriptKind_permW0N0E0
+... ok
+test compilerGetScriptVersion_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerGetScriptVersionUnknown_permW0N0E0
+... ok
+test compilerGetScriptSnapshot_permW0N0E0
+... ok
+test compilerGetCurrentDirectory_permW0N0E0
+... ok
+test compilerGetDefaultLibFileName_permW0N0E0
+... ok
+test compilerUseCaseSensitiveFileNames_permW0N0E0
+... ok
+test compilerReadFile_permW0N0E0
+... ok
+test compilerFileExists_permW0N0E0
+... ok
+test compilerResolveModuleNames_permW0N0E0
+... ok
+test consoleTestAssert_permW0N0E0
+... ok
+test consoleTestStringifyComplexObjects_permW0N0E0
+... ok
+test consoleTestStringifyCircular_permW0N0E0
+... ok
+test consoleTestStringifyWithDepth_permW0N0E0
+... ok
+test consoleTestError_permW0N0E0
+... ok
+test consoleDetachedLog_permW0N0E0
+Hello world
+Hello world
+Hello world
+Hello world
+Hello world
+Hello world
+... ok
+test fetchPerm_permW0N0E0
diff --git a/tools/testdata/unit_test_output3.txt b/tools/testdata/unit_test_output3.txt
new file mode 100644
index 000000000..402261e76
--- /dev/null
+++ b/tools/testdata/unit_test_output3.txt
@@ -0,0 +1,268 @@
+Compiling /Users/rld/src/deno/js/unit_tests.ts
+Compiling /Users/rld/src/deno/js/compiler_test.ts
+Compiling /Users/rld/src/deno/js/test_util.ts
+Compiling /Users/rld/src/deno/js/testing/testing.ts
+Compiling /Users/rld/src/deno/js/testing/util.ts
+Compiling /Users/rld/src/deno/js/console_test.ts
+Compiling /Users/rld/src/deno/js/console.ts
+Compiling /Users/rld/src/deno/js/fetch_test.ts
+Compiling /Users/rld/src/deno/js/os_test.ts
+Compiling /Users/rld/src/deno/js/files_test.ts
+Compiling /Users/rld/src/deno/js/read_file_test.ts
+Compiling /Users/rld/src/deno/js/read_dir_test.ts
+Compiling /Users/rld/src/deno/js/write_file_test.ts
+Compiling /Users/rld/src/deno/js/copy_file_test.ts
+Compiling /Users/rld/src/deno/js/mkdir_test.ts
+Compiling /Users/rld/src/deno/js/make_temp_dir_test.ts
+Compiling /Users/rld/src/deno/js/stat_test.ts
+Compiling /Users/rld/src/deno/js/rename_test.ts
+Compiling /Users/rld/src/deno/js/read_link_test.ts
+Compiling /Users/rld/src/deno/js/blob_test.ts
+Compiling /Users/rld/src/deno/js/timers_test.ts
+Compiling /Users/rld/src/deno/js/symlink_test.ts
+Compiling /Users/rld/src/deno/js/platform_test.ts
+Compiling /Users/rld/src/deno/js/text_encoding_test.ts
+Compiling /Users/rld/src/deno/js/net_test.ts
+Compiling /Users/rld/src/deno/js/trace_test.ts
+Compiling /Users/rld/src/deno/js/truncate_test.ts
+Compiling /Users/rld/src/deno/js/v8_source_maps_test.ts
+Compiling /Users/rld/src/deno/website/app_test.js
+Compiling /Users/rld/src/deno/website/app.js
+running 96 tests
+test permSerialization_permW0N0E0
+... ok
+test permFromStringThrows_permW0N0E0
+... ok
+test compilerInstance_permW0N0E0
+... ok
+test compilerRun_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerRunMultiModule_permW0N0E0
+... ok
+test compilerRunCircularDependency_permW0N0E0
+Compiling modA
+Compiling modB
+... ok
+test compilerResolveModule_permW0N0E0
+... ok
+test compilerGetModuleDependencies_permW0N0E0
+... ok
+test compilerGetCompilationSettings_permW0N0E0
+... ok
+test compilerGetNewLine_permW0N0E0
+... ok
+test compilerGetScriptFileNames_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerRecompileFlag_permW0N0E0
+Compiling /root/project/foo/bar.ts
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerGetScriptKind_permW0N0E0
+... ok
+test compilerGetScriptVersion_permW0N0E0
+Compiling /root/project/foo/bar.ts
+... ok
+test compilerGetScriptVersionUnknown_permW0N0E0
+... ok
+test compilerGetScriptSnapshot_permW0N0E0
+... ok
+test compilerGetCurrentDirectory_permW0N0E0
+... ok
+test compilerGetDefaultLibFileName_permW0N0E0
+... ok
+test compilerUseCaseSensitiveFileNames_permW0N0E0
+... ok
+test compilerReadFile_permW0N0E0
+... ok
+test compilerFileExists_permW0N0E0
+... ok
+test compilerResolveModuleNames_permW0N0E0
+... ok
+test consoleTestAssert_permW0N0E0
+... ok
+test consoleTestStringifyComplexObjects_permW0N0E0
+... ok
+test consoleTestStringifyCircular_permW0N0E0
+... ok
+test consoleTestStringifyWithDepth_permW0N0E0
+... ok
+test consoleTestError_permW0N0E0
+... ok
+test consoleDetachedLog_permW0N0E0
+Hello world
+Hello world
+Hello world
+Hello world
+Hello world
+Hello world
+... ok
+test fetchPerm_permW0N0E0
+... ok
+test headersAppend_permW0N0E0
+... ok
+test newHeaderTest_permW0N0E0
+... ok
+test newHeaderWithSequence_permW0N0E0
+... ok
+test newHeaderWithRecord_permW0N0E0
+... ok
+test newHeaderWithHeadersInstance_permW0N0E0
+... ok
+test headerAppendSuccess_permW0N0E0
+... ok
+test headerSetSuccess_permW0N0E0
+... ok
+test headerHasSuccess_permW0N0E0
+... ok
+test headerDeleteSuccess_permW0N0E0
+... ok
+test headerGetSuccess_permW0N0E0
+... ok
+test headerForEachSuccess_permW0N0E0
+... ok
+test envFailure_permW0N0E0
+... ok
+test filesStdioFileDescriptors_permW0N0E0
+... ok
+test filesCopyToStdout_permW0N0E0
+{
+ "name": "deno",
+ "devDependencies": {
+ "@types/base64-js": "^1.2.5",
+ "@types/flatbuffers": "^1.9.0",
+ "@types/source-map-support": "^0.4.1",
+ "@types/text-encoding": "0.0.33",
+ "base64-js": "^1.3.0",
+ "flatbuffers": "^1.9.0",
+ "magic-string": "^0.22.5",
+ "prettier": "^1.14.0",
+ "rollup": "^0.63.2",
+ "rollup-plugin-alias": "^1.4.0",
+ "rollup-plugin-analyzer": "^2.1.0",
+ "rollup-plugin-commonjs": "^9.1.3",
+ "rollup-plugin-node-globals": "^1.2.1",
+ "rollup-plugin-node-resolve": "^3.3.0",
+ "rollup-plugin-string": "^2.0.2",
+ "rollup-plugin-typescript2": "^0.16.1",
+ "rollup-pluginutils": "^2.3.0",
+ "source-map-support": "^0.5.6",
+ "text-encoding": "0.6.4",
+ "tslint": "^5.10.0",
+ "tslint-eslint-rules": "^5.3.1",
+ "tslint-no-circular-imports": "^0.5.0",
+ "typescript": "3.0.3"
+ }
+}
+bytes written 860
+... ok
+test readFileSyncSuccess_permW0N0E0
+... ok
+test readFileSyncNotFound_permW0N0E0
+... ok
+test readFileSuccess_permW0N0E0
+... ok
+test readDirSyncNotDir_permW0N0E0
+... ok
+test readDirSyncNotFound_permW0N0E0
+... ok
+test writeFileSyncPerm_permW0N0E0
+... ok
+test writeFilePerm_permW0N0E0
+... ok
+test copyFileSyncPerm_permW0N0E0
+... ok
+test copyFilePerm_permW0N0E0
+... ok
+test mkdirSyncPerm_permW0N0E0
+... ok
+test makeTempDirSyncPerm_permW0N0E0
+... ok
+test statSyncSuccess_permW0N0E0
+... ok
+test statSyncNotFound_permW0N0E0
+... ok
+test lstatSyncSuccess_permW0N0E0
+... ok
+test lstatSyncNotFound_permW0N0E0
+... ok
+test statSuccess_permW0N0E0
+... ok
+test statNotFound_permW0N0E0
+... ok
+test lstatSuccess_permW0N0E0
+... ok
+test lstatNotFound_permW0N0E0
+... ok
+test renameSyncPerm_permW0N0E0
+... ok
+test readlinkSyncNotFound_permW0N0E0
+... ok
+test blobString_permW0N0E0
+... ok
+test blobBuffer_permW0N0E0
+... ok
+test blobSlice_permW0N0E0
+... ok
+test timeoutSuccess_permW0N0E0
+... ok
+test timeoutArgs_permW0N0E0
+... ok
+test timeoutCancelSuccess_permW0N0E0
+... ok
+test timeoutCancelMultiple_permW0N0E0
+... ok
+test timeoutCancelInvalidSilentFail_permW0N0E0
+... ok
+test intervalSuccess_permW0N0E0
+... ok
+test intervalCancelSuccess_permW0N0E0
+... ok
+test intervalOrdering_permW0N0E0
+... ok
+test intervalCancelInvalidSilentFail_permW0N0E0
+... ok
+test symlinkSyncPerm_permW0N0E0
+... ok
+test platformTransform_permW0N0E0
+... ok
+test atobSuccess_permW0N0E0
+... ok
+test btoaSuccess_permW0N0E0
+... ok
+test btoaFailed_permW0N0E0
+... ok
+test truncateSyncPerm_permW0N0E0
+... ok
+test truncatePerm_permW0N0E0
+... ok
+test evalErrorFormatted_permW0N0E0
+... ok
+test createExecTimeColumnsRegularData_permW0N0E0
+... ok
+test createExecTimeColumnsIrregularData_permW0N0E0
+... ok
+test createBinarySizeColumnsRegularData_permW0N0E0
+... ok
+test createBinarySizeColumnsIrregularData_permW0N0E0
+... ok
+test createThreadCountColumnsRegularData_permW0N0E0
+... ok
+test createThreadCountColumnsIrregularData_permW0N0E0
+... ok
+test createSyscallCountColumnsRegularData_permW0N0E0
+... ok
+test createSyscallCountColumnsIrregularData_permW0N0E0
+... ok
+test createSha1ListRegularData_permW0N0E0
+... ok
+test formatBytesPatterns_permW0N0E0
+... ok
+test formatSecondsPatterns_permW0N0E0
+... ok
+test getTravisDataSuccess_permW0N0E0
+... ok
+
+test result: ok. 96 passed; 0 failed; 0 ignored; 0 measured; 36 filtered out
+
diff --git a/tools/testdata/wrk1.txt b/tools/testdata/wrk1.txt
new file mode 100644
index 000000000..8ad7cf739
--- /dev/null
+++ b/tools/testdata/wrk1.txt
@@ -0,0 +1,14 @@
+Running 10s test @ http://127.0.0.1:4500/
+ 2 threads and 10 connections
+ Thread Stats Avg Stdev Max +/- Stdev
+ Latency 5.08ms 1.37ms 34.96ms 96.63%
+ Req/Sec 0.92k 51.83 1.00k 78.50%
+ Latency Distribution
+ 50% 1.96ms
+ 75% 2.02ms
+ 90% 2.43ms
+ 99% 6.25ms
+ 18381 requests in 10.00s, 0.89MB read
+ Socket errors: connect 0, read 18381, write 0, timeout 0
+Requests/sec: 1837.86
+Transfer/sec: 91.53KB
diff --git a/tools/testdata/wrk2.txt b/tools/testdata/wrk2.txt
new file mode 100644
index 000000000..4b68c6c8a
--- /dev/null
+++ b/tools/testdata/wrk2.txt
@@ -0,0 +1,13 @@
+Running 10s test @ http://127.0.0.1:4544/
+ 2 threads and 10 connections
+ Thread Stats Avg Stdev Max +/- Stdev
+ Latency 402.90us 1.15ms 1.25us 94.86%
+ Req/Sec 26.86k 2.01k 31.81k 78.71%
+ Latency Distribution
+ 50% 2.03ms
+ 75% 2.10ms
+ 90% 2.43ms
+ 99% 6.22ms
+ 539721 requests in 10.10s, 26.25MB read
+Requests/sec: 53435.75
+Transfer/sec: 2.60MB
diff --git a/tools/testdata/wrk3.txt b/tools/testdata/wrk3.txt
new file mode 100644
index 000000000..4c115a096
--- /dev/null
+++ b/tools/testdata/wrk3.txt
@@ -0,0 +1,13 @@
+Running 10s test @ http://127.0.0.1:4544/
+ 2 threads and 10 connections
+ Thread Stats Avg Stdev Max +/- Stdev
+ Latency 26.55ms 152.26ms 1.63s 97.45%
+ Req/Sec 48.26k 3.13k 61.41k 93.00%
+ Latency Distribution
+ 50% 1.98ms
+ 75% 2.06ms
+ 90% 2.47ms
+ 99% 6.36ms
+ 960491 requests in 10.00s, 80.61MB read
+Requests/sec: 96037.58
+Transfer/sec: 8.06MB
diff --git a/tools/third_party.py b/tools/third_party.py
new file mode 100644
index 000000000..bdb5662af
--- /dev/null
+++ b/tools/third_party.py
@@ -0,0 +1,270 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# This script contains helper functions to work with the third_party subrepo.
+
+import os
+import re
+import site
+import sys
+from tempfile import mkdtemp
+from util import add_env_path, executable_suffix, libdeno_path, make_env, rmtree
+from util import root_path, run, third_party_path
+
+depot_tools_path = os.path.join(third_party_path, "depot_tools")
+prebuilt_path = os.path.join(root_path, "prebuilt")
+python_packages_path = os.path.join(third_party_path, "python_packages")
+
+python_site_env = None
+
+
+# Creates/modifies an environment so python can find packages that are bundled
+# in the 'third_party' directory.
+def python_env(env=None, merge_env=None):
+ if merge_env is None:
+ merge_env = {}
+ global python_site_env
+
+ # Use site.addsitedir() to determine which search paths would be considered
+ # if 'third_party/python_packages' was a site-packages directory.
+ # PATH is also updated, so windows can find the DLLs that ship with pywin32.
+ if python_site_env is None:
+ python_site_env = {}
+ temp = os.environ["PATH"], sys.path
+ os.environ["PATH"], sys.path = "", []
+ site.addsitedir(os.path.join(libdeno_path,
+ "build")) # Modifies PATH and sys.path.
+ site.addsitedir(python_packages_path) # Modifies PATH and sys.path.
+ python_site_env = {"PATH": os.environ["PATH"], "PYTHONPATH": sys.path}
+ os.environ["PATH"], sys.path = temp
+
+ # Make a new environment object.
+ env = make_env(env=env, merge_env=merge_env)
+ # Apply PATH and PYTHONPATH from the site-packages environment.
+ add_env_path(python_site_env["PATH"], env=env, key="PATH")
+ add_env_path(python_site_env["PYTHONPATH"], env=env, key="PYTHONPATH")
+
+ return env
+
+
+# This function creates or modifies an environment so that it matches the
+# expectations of various google tools (gn, gclient, etc).
+def google_env(env=None, merge_env=None, depot_tools_path_=depot_tools_path):
+ if merge_env is None:
+ merge_env = {}
+ # Google tools need the python env too.
+ env = python_env(env=env, merge_env=merge_env)
+
+ # Depot_tools to be in the PATH, before Python.
+ add_env_path(depot_tools_path_, env=env, prepend=True)
+
+ if os.name == "nt": # Windows-only enviroment tweaks.
+ # We're not using Google's internal infrastructure.
+ if os.name == "nt" and not "DEPOT_TOOLS_WIN_TOOLCHAIN" in env:
+ env["DEPOT_TOOLS_WIN_TOOLCHAIN"] = "0"
+
+ # The 'setup_toolchain.py' script does a good job finding the Windows
+ # SDK. Unfortunately, if any of the environment variables below are set
+ # (as vcvarsall.bat typically would), setup_toolchain absorbs them too,
+ # adding multiple identical -imsvc<path> items to CFLAGS.
+ # This small variation has no effect on compiler output, but it
+ # makes ninja rebuild everything, and causes sccache cache misses.
+ # TODO(piscisaureus): fix this upstream.
+ env["INCLUDE"] = ""
+ env["LIB"] = ""
+ env["LIBPATH"] = ""
+
+ return env
+
+
+# Run Yarn to install JavaScript dependencies.
+def run_yarn():
+ run(["yarn", "install"], cwd=third_party_path)
+
+
+# Install python packages with pip.
+def run_pip():
+ # Install an recent version of pip into a temporary directory. The version
+ # that is bundled with python is too old to support the next step.
+ temp_python_home = mkdtemp()
+ pip_env = {"PYTHONUSERBASE": temp_python_home}
+ run([sys.executable, "-m", "pip", "install", "--upgrade", "--user", "pip"],
+ cwd=third_party_path,
+ merge_env=pip_env)
+
+ # Install pywin32.
+ run([
+ sys.executable, "-m", "pip", "install", "--upgrade", "--target",
+ python_packages_path, "--platform=win_amd64", "--only-binary=:all:",
+ "pypiwin32"
+ ],
+ cwd=third_party_path,
+ merge_env=pip_env)
+
+ # Get yapf.
+ run([
+ sys.executable, "-m", "pip", "install", "--upgrade", "--target",
+ python_packages_path, "yapf"
+ ],
+ cwd=third_party_path,
+ merge_env=pip_env)
+
+ run([
+ sys.executable, "-m", "pip", "install", "--upgrade", "--target",
+ python_packages_path, "pylint==1.5.6"
+ ],
+ cwd=third_party_path,
+ merge_env=pip_env)
+
+ # Remove the temporary pip installation.
+ rmtree(temp_python_home)
+
+
+# Run gclient to install other dependencies.
+def run_gclient_sync():
+ # Depot_tools will normally try to self-update, which will fail because
+ # it's not checked out from it's own git repository; gclient will then try
+ # to fix things up and not succeed, and and we'll end up with a huge mess.
+ # To work around this, we rename the `depot_tools` directory to
+ # `{root_path}/depot_tools_temp` first, and we set DEPOT_TOOLS_UPDATE=0 in
+ # the environment so depot_tools doesn't attempt to self-update.
+ # Since depot_tools is listed in .gclient_entries, gclient will install a
+ # fresh copy in `third_party/depot_tools`.
+ # If it all works out, we remove the depot_tools_temp directory afterwards.
+ depot_tools_temp_path = os.path.join(root_path, "depot_tools_temp")
+
+ # Rename depot_tools to depot_tools_temp.
+ try:
+ os.rename(depot_tools_path, depot_tools_temp_path)
+ except OSError:
+ # If renaming failed, and the depot_tools_temp directory already exists,
+ # assume that it's still there because a prior run_gclient_sync() call
+ # failed half-way, before we got the chance to remove the temp dir.
+ # We'll use whatever is in the temp dir that was already there.
+ # If not, the user can recover by removing the temp directory manually.
+ if os.path.isdir(depot_tools_temp_path):
+ pass
+ else:
+ raise
+
+ args = [
+ "gclient", "sync", "--reset", "--shallow", "--no-history", "--nohooks"
+ ]
+ envs = {
+ "DEPOT_TOOLS_UPDATE": "0",
+ "GCLIENT_FILE": os.path.join(root_path, "gclient_config.py")
+ }
+ env = google_env(depot_tools_path_=depot_tools_temp_path, merge_env=envs)
+ run(args, cwd=third_party_path, env=env)
+
+ # Delete the depot_tools_temp directory, but not before verifying that
+ # gclient did indeed install a fresh copy.
+ # Also check that `{depot_tools_temp_path}/gclient.py` exists, so a typo in
+ # this script won't accidentally blow out someone's home dir.
+ if (os.path.isdir(os.path.join(depot_tools_path, ".git"))
+ and os.path.isfile(os.path.join(depot_tools_path, "gclient.py"))
+ and os.path.isfile(
+ os.path.join(depot_tools_temp_path, "gclient.py"))):
+ rmtree(depot_tools_temp_path)
+
+
+def get_platform_dir_name():
+ if sys.platform == "win32":
+ return "win"
+ elif sys.platform == "darwin":
+ return "mac"
+ elif sys.platform.startswith("linux"):
+ return "linux64"
+
+
+def get_prebuilt_tool_path(tool):
+ return os.path.join(prebuilt_path, get_platform_dir_name(),
+ tool + executable_suffix)
+
+
+def get_buildtools_tool_path(tool):
+ return os.path.join(libdeno_path, "buildtools", get_platform_dir_name(),
+ tool + executable_suffix)
+
+
+# Download the given item from Google storage.
+def download_from_google_storage(item, bucket, base_dir):
+ download_script = os.path.join(depot_tools_path,
+ "download_from_google_storage.py")
+ sha1_file = os.path.join(base_dir, get_platform_dir_name(),
+ item + executable_suffix + ".sha1")
+ run([
+ sys.executable,
+ download_script,
+ "--platform=" + sys.platform,
+ "--no_auth",
+ "--bucket=%s" % bucket,
+ "--sha1_file",
+ sha1_file,
+ ],
+ env=google_env())
+
+
+# Download the given item from Chrome Infrastructure Package Deployment.
+def download_from_cipd(item, version):
+ cipd_exe = os.path.join(depot_tools_path, "cipd")
+ download_dir = os.path.join(libdeno_path, "buildtools",
+ get_platform_dir_name())
+
+ if sys.platform == "win32":
+ item += "windows-amd64"
+ elif sys.platform == "darwin":
+ item += "mac-amd64"
+ elif sys.platform.startswith("linux"):
+ item += "linux-amd64"
+
+ # Init cipd if necessary.
+ if not os.path.exists(os.path.join(download_dir, ".cipd")):
+ run([
+ cipd_exe,
+ "init",
+ download_dir,
+ "-force",
+ ], env=google_env())
+
+ run([
+ cipd_exe,
+ "install",
+ item,
+ "git_revision:" + version,
+ "-root",
+ download_dir,
+ ],
+ env=google_env())
+
+
+# Download gn from Google storage.
+def download_gn():
+ download_from_cipd("gn/gn/", "152c5144ceed9592c20f0c8fd55769646077569b")
+
+
+# Download clang-format from Google storage.
+def download_clang_format():
+ download_from_google_storage("clang-format", "chromium-clang-format",
+ os.path.join(libdeno_path, "buildtools"))
+
+
+def download_sccache():
+ download_from_google_storage("sccache", "denoland", prebuilt_path)
+
+
+def download_hyperfine():
+ download_from_google_storage("hyperfine", "denoland", prebuilt_path)
+
+
+# Download clang by calling the clang update script.
+def download_clang():
+ update_script = os.path.join(libdeno_path, "v8", "tools", "clang",
+ "scripts", "update.py")
+ run([sys.executable, update_script], env=google_env())
+
+
+def maybe_download_sysroot():
+ if sys.platform.startswith("linux"):
+ install_script = os.path.join(libdeno_path, "build", "linux",
+ "sysroot_scripts", "install-sysroot.py")
+ run([sys.executable, install_script, "--arch=amd64"], env=google_env())
diff --git a/tools/throughput_benchmark.py b/tools/throughput_benchmark.py
new file mode 100755
index 000000000..f46503193
--- /dev/null
+++ b/tools/throughput_benchmark.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Performs benchmark and append data to //website/data.json.
+# If //website/data.json doesn't exist, this script tries to import it from
+# gh-pages branch.
+# To view the results locally run ./tools/http_server.py and visit
+# http://localhost:4545/website
+
+import os
+import sys
+import time
+import subprocess
+import util
+
+MB = 1024 * 1024
+SERVER_ADDR = "0.0.0.0:4544"
+CLIENT_ADDR = "127.0.0.1 4544"
+
+
+def cat(deno_exe, megs):
+ size = megs * MB
+ start = time.time()
+ cmd = deno_exe + " run --allow-read "
+ cmd += "tests/cat.ts /dev/zero | head -c %s " % size
+ print cmd
+ subprocess.check_output(cmd, shell=True)
+ end = time.time()
+ return end - start
+
+
+def tcp(deno_exe, megs):
+ size = megs * MB
+ # Run deno echo server in the background.
+ args = [
+ deno_exe, "run", "--allow-net", "tests/echo_server.ts", SERVER_ADDR
+ ]
+ print args
+ echo_server = subprocess.Popen(args)
+
+ time.sleep(5) # wait for deno to wake up. TODO racy.
+ try:
+ start = time.time()
+ nc_cmd = "nc " + CLIENT_ADDR
+ cmd = ("head -c %s /dev/zero " % size) + " | " + nc_cmd
+ print cmd
+ subprocess.check_output(cmd, shell=True)
+ end = time.time()
+ return end - start
+ finally:
+ echo_server.kill()
+
+
+def main():
+ deno_exe = sys.argv[1]
+ megs = int(sys.argv[2])
+ if not deno_exe or not megs:
+ print "Usage ./tools/throughput_benchmark.py target/debug/deno 100"
+ sys.exit(1)
+ secs = tcp(sys.argv[1], megs)
+ print secs, "seconds"
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/upload_website.py b/tools/upload_website.py
new file mode 100755
index 000000000..e1d100f99
--- /dev/null
+++ b/tools/upload_website.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+import sys
+import tempfile
+from util import run, root_path, build_path
+
+# Probably run tools/docs.py first.
+# AWS CLI must be installed separately.
+
+os.chdir(os.path.join(root_path, "website"))
+
+deno_exe = os.path.join(build_path(), "deno")
+run([sys.executable, "../tools/build_website.py"])
+
+# Invalidate the cache.
+run([
+ "aws", "cloudfront", "create-invalidation", "--distribution-id",
+ "E2HNK8Z3X3JDVG", "--paths", "/*"
+])
+
+run(["aws", "s3", "sync", ".", "s3://deno.land/"])
diff --git a/tools/util.py b/tools/util.py
new file mode 100644
index 000000000..9a4c0ce02
--- /dev/null
+++ b/tools/util.py
@@ -0,0 +1,413 @@
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import collections
+import os
+import re
+import shutil
+import select
+import stat
+import sys
+import subprocess
+import tempfile
+import time
+
+if os.environ.get("NO_COLOR", None):
+ RESET = FG_READ = FG_GREEN = ""
+else:
+ RESET = "\x1b[0m"
+ FG_RED = "\x1b[31m"
+ FG_GREEN = "\x1b[32m"
+
+executable_suffix = ".exe" if os.name == "nt" else ""
+
+root_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+libdeno_path = os.path.join(root_path, "core", "libdeno")
+tests_path = os.path.join(root_path, "tests")
+third_party_path = os.path.join(root_path, "third_party")
+
+
+def make_env(merge_env=None, env=None):
+ if env is None:
+ env = os.environ
+ env = env.copy()
+ if merge_env is None:
+ merge_env = {}
+ for key in merge_env.keys():
+ env[key] = merge_env[key]
+ return env
+
+
+def add_env_path(add, env, key="PATH", prepend=False):
+ dirs_left = env[key].split(os.pathsep) if key in env else []
+ dirs_right = add.split(os.pathsep) if isinstance(add, str) else add
+
+ if prepend:
+ dirs_left, dirs_right = dirs_right, dirs_left
+
+ for d in dirs_right:
+ if not d in dirs_left:
+ dirs_left += [d]
+
+ env[key] = os.pathsep.join(dirs_left)
+
+
+def run(args, quiet=False, cwd=None, env=None, merge_env=None, shell=None):
+ args[0] = os.path.normpath(args[0])
+ env = make_env(env=env, merge_env=merge_env)
+ if shell is None:
+ # Use the default value for 'shell' parameter.
+ # - Posix: do not use shell.
+ # - Windows: use shell; this makes .bat/.cmd files work.
+ shell = os.name == "nt"
+ if not quiet:
+ print " ".join([shell_quote(arg) for arg in args])
+ rc = subprocess.call(args, cwd=cwd, env=env, shell=shell)
+ if rc != 0:
+ sys.exit(rc)
+
+
+CmdResult = collections.namedtuple('CmdResult', ['out', 'err', 'code'])
+
+
+def run_output(args,
+ quiet=False,
+ cwd=None,
+ env=None,
+ merge_env=None,
+ exit_on_fail=False):
+ if merge_env is None:
+ merge_env = {}
+ args[0] = os.path.normpath(args[0])
+ if not quiet:
+ print " ".join(args)
+ env = make_env(env=env, merge_env=merge_env)
+ shell = os.name == "nt" # Run through shell to make .bat/.cmd files work.
+ p = subprocess.Popen(
+ args,
+ cwd=cwd,
+ env=env,
+ shell=shell,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ try:
+ out, err = p.communicate()
+ except subprocess.CalledProcessError as e:
+ p.kill()
+ p.wait()
+ raise e
+ retcode = p.poll()
+ if retcode and exit_on_fail:
+ sys.exit(retcode)
+ # Ignore Windows CRLF (\r\n).
+ return CmdResult(
+ out.replace('\r\n', '\n'), err.replace('\r\n', '\n'), retcode)
+
+
+def shell_quote_win(arg):
+ if re.search(r'[\x00-\x20"^%~!@&?*<>|()=]', arg):
+ # Double all " quote characters.
+ arg = arg.replace('"', '""')
+ # Wrap the entire string in " quotes.
+ arg = '"' + arg + '"'
+ # Double any N backslashes that are immediately followed by a " quote.
+ arg = re.sub(r'(\\+)(?=")', r'\1\1', arg)
+ return arg
+
+
+def shell_quote(arg):
+ if os.name == "nt":
+ return shell_quote_win(arg)
+ else:
+ # Python 2 has posix shell quoting built in, albeit in a weird place.
+ from pipes import quote
+ return quote(arg)
+
+
+def symlink(target, name, target_is_dir=False):
+ if os.name == "nt":
+ from ctypes import WinDLL, WinError, GetLastError
+ from ctypes.wintypes import BOOLEAN, DWORD, LPCWSTR
+
+ kernel32 = WinDLL('kernel32', use_last_error=False)
+ CreateSymbolicLinkW = kernel32.CreateSymbolicLinkW
+ CreateSymbolicLinkW.restype = BOOLEAN
+ CreateSymbolicLinkW.argtypes = (LPCWSTR, LPCWSTR, DWORD)
+
+ # File-type symlinks can only use backslashes as separators.
+ target = os.path.normpath(target)
+
+ # If the symlink points at a directory, it needs to have the appropriate
+ # flag set, otherwise the link will be created but it won't work.
+ if target_is_dir:
+ type_flag = 0x01 # SYMBOLIC_LINK_FLAG_DIRECTORY
+ else:
+ type_flag = 0
+
+ # Before Windows 10, creating symlinks requires admin privileges.
+ # As of Win 10, there is a flag that allows anyone to create them.
+ # Initially, try to use this flag.
+ unpriv_flag = 0x02 # SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
+ r = CreateSymbolicLinkW(name, target, type_flag | unpriv_flag)
+
+ # If it failed with ERROR_INVALID_PARAMETER, try again without the
+ # 'allow unprivileged create' flag.
+ if not r and GetLastError() == 87: # ERROR_INVALID_PARAMETER
+ r = CreateSymbolicLinkW(name, target, type_flag)
+
+ # Throw if unsuccessful even after the second attempt.
+ if not r:
+ raise WinError()
+ else:
+ os.symlink(target, name)
+
+
+def touch(fname):
+ if os.path.exists(fname):
+ os.utime(fname, None)
+ else:
+ open(fname, 'a').close()
+
+
+# Recursively list all files in (a subdirectory of) a git worktree.
+# * Optionally, glob patterns may be specified to e.g. only list files with a
+# certain extension.
+# * Untracked files are included, unless they're listed in .gitignore.
+# * Directory names themselves are not listed (but the files inside are).
+# * Submodules and their contents are ignored entirely.
+# * This function fails if the query matches no files.
+def git_ls_files(base_dir, patterns=None):
+ base_dir = os.path.abspath(base_dir)
+ args = [
+ "git", "-C", base_dir, "ls-files", "-z", "--exclude-standard",
+ "--cached", "--modified", "--others"
+ ]
+ if patterns:
+ args += ["--"] + patterns
+ output = subprocess.check_output(args)
+ files = [
+ os.path.normpath(os.path.join(base_dir, f)) for f in output.split("\0")
+ if f != ""
+ ]
+ if not files:
+ raise RuntimeError("git_ls_files: no files in '%s'" % base_dir +
+ (" matching %s" % patterns if patterns else ""))
+ return files
+
+
+# The Python equivalent of `rm -rf`.
+def rmtree(directory):
+ # On Windows, shutil.rmtree() won't delete files that have a readonly bit.
+ # Git creates some files that do. The 'onerror' callback deals with those.
+ def rm_readonly(func, path, _):
+ os.chmod(path, stat.S_IWRITE)
+ func(path)
+
+ shutil.rmtree(directory, onerror=rm_readonly)
+
+
+def build_mode(default="debug"):
+ if "DENO_BUILD_MODE" in os.environ:
+ return os.environ["DENO_BUILD_MODE"]
+ elif "--release" in sys.argv:
+ return "release"
+ else:
+ return default
+
+
+# E.G. "target/debug"
+def build_path():
+ if "DENO_BUILD_PATH" in os.environ:
+ return os.environ["DENO_BUILD_PATH"]
+ else:
+ return os.path.join(root_path, "target", build_mode())
+
+
+def parse_exit_code(s):
+ codes = [int(d or 1) for d in re.findall(r'error(\d*)', s)]
+ if len(codes) > 1:
+ assert False, "doesn't support multiple error codes."
+ elif len(codes) == 1:
+ return codes[0]
+ else:
+ return 0
+
+
+# Attempts to enable ANSI escape code support.
+# Returns True if successful, False if not supported.
+def enable_ansi_colors():
+ if os.name != 'nt':
+ return True # On non-windows platforms this just works.
+ return enable_ansi_colors_win10()
+
+
+# The windows 10 implementation of enable_ansi_colors.
+def enable_ansi_colors_win10():
+ import ctypes
+
+ # Function factory for errcheck callbacks that raise WinError on failure.
+ def raise_if(error_result):
+ def check(result, _func, args):
+ if result == error_result:
+ raise ctypes.WinError(ctypes.get_last_error())
+ return args
+
+ return check
+
+ # Windows API types.
+ from ctypes.wintypes import BOOL, DWORD, HANDLE, LPCWSTR, LPVOID
+ LPDWORD = ctypes.POINTER(DWORD)
+
+ # Generic constants.
+ NULL = ctypes.c_void_p(0).value
+ INVALID_HANDLE_VALUE = ctypes.c_void_p(-1).value
+ ERROR_INVALID_PARAMETER = 87
+
+ # CreateFile flags.
+ # yapf: disable
+ GENERIC_READ = 0x80000000
+ GENERIC_WRITE = 0x40000000
+ FILE_SHARE_READ = 0x01
+ FILE_SHARE_WRITE = 0x02
+ OPEN_EXISTING = 3
+ # yapf: enable
+
+ # Get/SetConsoleMode flags.
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x04
+
+ kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
+
+ # HANDLE CreateFileW(...)
+ CreateFileW = kernel32.CreateFileW
+ CreateFileW.restype = HANDLE
+ CreateFileW.errcheck = raise_if(INVALID_HANDLE_VALUE)
+ # yapf: disable
+ CreateFileW.argtypes = (LPCWSTR, # lpFileName
+ DWORD, # dwDesiredAccess
+ DWORD, # dwShareMode
+ LPVOID, # lpSecurityAttributes
+ DWORD, # dwCreationDisposition
+ DWORD, # dwFlagsAndAttributes
+ HANDLE) # hTemplateFile
+ # yapf: enable
+
+ # BOOL CloseHandle(HANDLE hObject)
+ CloseHandle = kernel32.CloseHandle
+ CloseHandle.restype = BOOL
+ CloseHandle.errcheck = raise_if(False)
+ CloseHandle.argtypes = (HANDLE, )
+
+ # BOOL GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode)
+ GetConsoleMode = kernel32.GetConsoleMode
+ GetConsoleMode.restype = BOOL
+ GetConsoleMode.errcheck = raise_if(False)
+ GetConsoleMode.argtypes = (HANDLE, LPDWORD)
+
+ # BOOL SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode)
+ SetConsoleMode = kernel32.SetConsoleMode
+ SetConsoleMode.restype = BOOL
+ SetConsoleMode.errcheck = raise_if(False)
+ SetConsoleMode.argtypes = (HANDLE, DWORD)
+
+ # Open the console output device.
+ conout = CreateFileW("CONOUT$", GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, 0, 0)
+
+ # Get the current mode.
+ mode = DWORD()
+ GetConsoleMode(conout, ctypes.byref(mode))
+
+ # Try to set the flag that controls ANSI escape code support.
+ try:
+ SetConsoleMode(conout, mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
+ except WindowsError as e: # pylint:disable=undefined-variable
+ if e.winerror == ERROR_INVALID_PARAMETER:
+ return False # Not supported, likely an older version of Windows.
+ raise
+ finally:
+ CloseHandle(conout)
+
+ return True
+
+
+def extract_number(pattern, string):
+ matches = re.findall(pattern, string)
+ if len(matches) != 1:
+ return None
+ return int(matches[0])
+
+
+def extract_max_latency_in_milliseconds(pattern, string):
+ matches = re.findall(pattern, string)
+ if len(matches) != 1:
+ return None
+ num = float(matches[0][0])
+ unit = matches[0][1]
+ if (unit == 'ms'):
+ return num
+ elif (unit == 'us'):
+ return num / 1000
+ elif (unit == 's'):
+ return num * 1000
+
+
+def parse_wrk_output(output):
+ stats = {}
+ stats['req_per_sec'] = None
+ stats['max_latency'] = None
+ for line in output.split("\n"):
+ if stats['req_per_sec'] is None:
+ stats['req_per_sec'] = extract_number(r'Requests/sec:\s+(\d+)',
+ line)
+ if stats['max_latency'] is None:
+ stats['max_latency'] = extract_max_latency_in_milliseconds(
+ r'\s+99%(?:\s+(\d+.\d+)([a-z]+))', line)
+ return stats
+
+
+def platform():
+ return {"linux2": "linux", "darwin": "mac", "win32": "win"}[sys.platform]
+
+
+def mkdtemp():
+ # On Windows, set the base directory that mkdtemp() uses explicitly. If not,
+ # it'll use the short (8.3) path to the temp dir, which triggers the error
+ # 'TS5009: Cannot find the common subdirectory path for the input files.'
+ temp_dir = os.environ["TEMP"] if os.name == 'nt' else None
+ return tempfile.mkdtemp(dir=temp_dir)
+
+
+# This function is copied from:
+# https://gist.github.com/hayd/4f46a68fc697ba8888a7b517a414583e
+# https://stackoverflow.com/q/52954248/1240268
+def tty_capture(cmd, bytes_input, timeout=5):
+ """Capture the output of cmd with bytes_input to stdin,
+ with stdin, stdout and stderr as TTYs."""
+ # pty is not available on windows, so we import it within this function.
+ import pty
+ mo, so = pty.openpty() # provide tty to enable line-buffering
+ me, se = pty.openpty()
+ mi, si = pty.openpty()
+ fdmap = {mo: 'stdout', me: 'stderr', mi: 'stdin'}
+
+ timeout_exact = time.time() + timeout
+ p = subprocess.Popen(
+ cmd, bufsize=1, stdin=si, stdout=so, stderr=se, close_fds=True)
+ os.write(mi, bytes_input)
+
+ select_timeout = .04 #seconds
+ res = {'stdout': b'', 'stderr': b''}
+ while True:
+ ready, _, _ = select.select([mo, me], [], [], select_timeout)
+ if ready:
+ for fd in ready:
+ data = os.read(fd, 512)
+ if not data:
+ break
+ res[fdmap[fd]] += data
+ elif p.poll() is not None or time.time(
+ ) > timeout_exact: # select timed-out
+ break # p exited
+ for fd in [si, so, se, mi, mo, me]:
+ os.close(fd) # can't do it sooner: it leads to errno.EIO error
+ p.wait()
+ return p.returncode, res['stdout'], res['stderr']
diff --git a/tools/util_test.py b/tools/util_test.py
new file mode 100755
index 000000000..b8098e463
--- /dev/null
+++ b/tools/util_test.py
@@ -0,0 +1,42 @@
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+
+from test_util import DenoTestCase, run_tests
+from util import (parse_exit_code, shell_quote_win, parse_wrk_output,
+ root_path)
+
+
+class TestUtil(DenoTestCase):
+ def test_parse_exit_code(self):
+ assert parse_exit_code('hello_error54_world') == 54
+ assert parse_exit_code('hello_error_world') == 1
+ assert parse_exit_code('hello_world') == 0
+
+ def test_shell_quote_win(self):
+ assert shell_quote_win('simple') == 'simple'
+ assert shell_quote_win(
+ 'roof/\\isoprojection') == 'roof/\\isoprojection'
+ assert shell_quote_win('with space') == '"with space"'
+ assert shell_quote_win('embedded"quote') == '"embedded""quote"'
+ assert shell_quote_win(
+ 'a"b""c\\d\\"e\\\\') == '"a""b""""c\\d\\\\""e\\\\\\\\"'
+
+ def test_parse_wrk_output(self):
+ f = open(os.path.join(root_path, "tools/testdata/wrk1.txt"))
+ stats = parse_wrk_output(f.read())
+ assert stats['req_per_sec'] == 1837
+ assert stats['max_latency'] == 6.25
+
+ f2 = open(os.path.join(root_path, "tools/testdata/wrk2.txt"))
+ stats2 = parse_wrk_output(f2.read())
+ assert stats2['req_per_sec'] == 53435
+ assert stats2['max_latency'] == 6.22
+
+ f3 = open(os.path.join(root_path, "tools/testdata/wrk3.txt"))
+ stats3 = parse_wrk_output(f3.read())
+ assert stats3['req_per_sec'] == 96037
+ assert stats3['max_latency'] == 6.36
+
+
+if __name__ == '__main__':
+ run_tests()