{"action":"created","comment":{"url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/comments/241508575","pull_request_review_id":184799995,"id":241508575,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MTUwODU3NQ==","diff_hunk":"@@ -0,0 +1,560 @@\n+# Copyright 2017 The Bazel Authors. All rights reserved.\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+#    http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+\n+\"\"\"Repository Rules to generate toolchain configs for an RBE-ubuntu16-04 container.\n+\n+Exposes the rbe_autoconfig macro that does the following:\n+- Pulls an rbe-ubuntu 16_04 image (using 'docker pull')\n+- Starts up a container using the rbe-ubuntu 16_04 image mounting the current project\n+- Installs the current version of Bazel (one currently running) on the container\n+  (or the one passed in with optional attr).\n+- Runs a bazel command to build the local_config_cc\n+  remote repository inside the container.\n+- Extracts local_config_cc produced files (inside the container) to the produced\n+  remote repository.\n+- Optionally copies the local_config_cc produced files to the project srcs under the\n+  given output_base directory\n+\n+Add to your WORKSPACE file the following:\n+\n+  load(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\", \"http_file\")\n+\n+  http_archive(\n+    name = \"bazel_toolchains\",\n+    urls = [\n+      \"https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/<latest_release>.tar.gz\",\n+      \"https://github.com/bazelbuild/bazel-toolchains/archive/<latest_release>.tar.gz\",\n+    ],\n+    strip_prefix = \"bazel-toolchains-<latest_commit>\",\n+    sha256 = \"<sha256>\",\n+  )\n+\n+  load(\n+    \"@bazel_toolchains//repositories:repositories.bzl\",\n+    bazel_toolchains_repositories = \"repositories\",\n+  )\n+\n+  bazel_toolchains_repositories()\n+\n+  load(\"@bazel_toolchains//rules:rbe_repo.bzl\", \"rbe_autoconfig\")\n+\n+  rbe_autoconfig(\n+    name = \"rbe_default\",\n+    # Optional. See below.\n+    output_base = \"rbe-configs\"\n+  )\n+\n+For values of <latest_release> and other placeholders above, please see\n+the WORKSPACE file in this repo.\n+\n+This rule depends on the value of the environment variable \"RBE_AUTOCONF_ROOT\"\n+when output_base is used.\n+This env var should be set to point to the absolute path root of your project.\n+Use the full absolute path to the project root (i.e., no '~', '../', or\n+other special chars).\n+\n+There are two modes of using this repo rules:\n+  1 - When output_base set (recommended), running the repo rule target will copy\n+    (env var \"RBE_AUTOCONF_ROOT\" is required) the toolchain config files to the\n+    output_base folder in the project sources.\n+    After that, you can run an RBE build pointing your crosstool_top flag to the\n+    produced files. If output_base is set to \"rbe-configs\" (recommended):\n+\n+      bazel build ... \\\n+                --crosstool_top=//rbe-configs/bazel_{bazel_version}:toolchain \\\n+                --host_javabase=//rbe-configs/bazel_{bazel_version}/platforms:jdk8 \\\n+                --javabase=//rbe-configs/bazel_{bazel_version}/platforms:jdk8 \\\n+                --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 \\\n+                --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 \\\n+                --extra_execution_platforms=/rbe-configs/bazel_{bazel_version}/platforms:rbe_ubuntu1604 \\\n+                --host_platform=/rbe-configs/bazel_{bazel_version}/platforms:rbe_ubuntu1604 \\\n+                --platforms=/rbe-configs/bazel_{bazel_version}/platforms:rbe_ubuntu1604 \\\n+                --extra_toolchains=/rbe-configs/bazel_{bazel_version}/platforms:cc-toolchain \\\n+                ... <other rbe flags> <build targets>\n+\n+    We recommend you check in the code in //rbe-configs/bazel_{bazel_version}\n+    so that users typically do not need to run this repo rule in order to do a\n+    remote build (i.e., once files are checked in, you do not need to run this\n+    rule until there is a new version of Bazel you want to support running with).\n+\n+  2 - When output_base is not set (env var \"RBE_AUTOCONF_ROOT\" is not required),\n+    running this rule will create targets in the\n+    remote repository (e.g., rbe_default) which can be used to point your\n+    flags to:\n+\n+      bazel build ... \\\n+                --crosstool_top=@rbe_default//rbe_config_cc:toolchain \\\n+                --host_javabase=@rbe_default//platforms:jdk8 \\\n+                --javabase=@rbe_default//platforms:jdk8 \\\n+                --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 \\\n+                --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 \\\n+                --extra_execution_platforms=@rbe_default//platforms:rbe_ubuntu1604 \\\n+                --host_platform=@rbe_default//platforms:rbe_ubuntu1604 \\\n+                --platforms=@rbe_default//platforms:rbe_ubuntu1604 \\\n+                --extra_toolchains=@rbe_default//platforms:cc-toolchain \\\n+\n+    Note running bazel clean --expunge_async, or otherwise modifying attrs or\n+    env variables used by this rule will trigger it to re-execute. Running this\n+    repo rule takes some time as it needs to pull a container, run it, and then\n+    run some commands inside. We recommend you use output_base and check in the produced\n+    files so you dont need to run this rule with every clean build.\n+\n+The {bazel_version} above corresponds to the version of bazel installed locally.\n+Note you can override this version and pass an optional rc# if desired.\n+Running this rule with a non release version (e.g., built from source) will not work.\n+If running with bazel built from source you must pass a bazel_version and bazel_rc\n+to rbe_autoconfig. Also, note the bazel_version bazel_rc must be published in\n+https://releases.bazel.build/...\n+\n+Note this is a very not hermetic repository rule that can actually change the\n+contents of your project sources. While this is generally not recommended by\n+Bazel, its the only reasonable way to get a rule that can produce valid\n+toolchains / platforms that need to be made available to Bazel before execution\n+of any build actions.\n+\n+Note: this rule expects the following utilities to be installed and available on\n+the PATH:\n+  - docker\n+  - tar\n+  - bash utilities (e.g., cp, mv, rm, etc)\n+\n+Known issues:\n+  - This rule cannot be executed inside a docker container.\n+  - This rule can only run in Linux.\n+\"\"\"\n+\n+load(\n+    \"@bazel_toolchains//rules:version_check.bzl\",\n+    \"check_bazel_version\",\n+    \"extract_version_number\",\n+    \"parse_rc\",\n+)\n+load(\n+    \"@bazel_toolchains//rules:toolchain_containers.bzl\",\n+    \"RBE_UBUNTU16_04_LATEST\",\n+    \"public_rbe_ubuntu16_04_sha256s\",\n+)\n+\n+# External folder is set to be deprecated, lets keep it here for easy\n+# refactoring\n+# https://github.com/bazelbuild/bazel/issues/1262\n+_EXTERNAL_FOLDER_PREFIX = \"external/\"\n+\n+_BAZEL_CONFIG_DIR = \"/bazel-config\"\n+_CONFIG_REPOS = [\"local_config_cc\"]\n+_PLATFORM_DIR = \"platforms\"\n+_PROJECT_REPO_DIR = \"project_src\"\n+_OUTPUT_DIR = _BAZEL_CONFIG_DIR + \"/autoconf_out\"\n+_REPO_DIR = _BAZEL_CONFIG_DIR + \"/\" + _PROJECT_REPO_DIR\n+_RBE_AUTOCONF_ROOT = \"RBE_AUTOCONF_ROOT\"\n+_RBE_CONFIG_DIR = \"rbe_config_cc\"\n+\n+# We use 'l.gcr.io' to not require users to do gcloud login\n+_RBE_UBUNTU_GCR = \"l.gcr.io/google/rbe-ubuntu16-04@\"\n+_VERBOSE = False\n+\n+def _impl(ctx):\n+    \"\"\"Core implementation of _rbe_autoconfig repository rule.\"\"\"\n+\n+    # Perform some safety checks\n+    _validate_host(ctx)\n+    project_root = ctx.os.environ.get(_RBE_AUTOCONF_ROOT, None)\n+    use_default_project = False\n+    if not project_root:\n+        if ctx.attr.output_base != \"\":\n+            fail((\"%s env variable must be set for rbe_autoconfig\" +\n+                  \" to function properly when output_base is set\") % _RBE_AUTOCONF_ROOT)\n+\n+        # Try to use the default project\n+        # This is Bazel black magic, we're traversing the directories in the output_base,\n+        # assuming that the bazel_toolchains external repo will exist in the\n+        # expected path.\n+        project_root = ctx.path(\".\").dirname.get_child(\"bazel_toolchains\").get_child(\"rules\").get_child(\"cc-sample-project\")\n+        if not project_root.exists:\n+            fail(\"Could not find default autoconf project in %s, please make sure \" +\n+                 \"the bazel-toolchains repo is properly imported in your workspace\")\n+        project_root = str(project_root)\n+        use_default_project = True\n+\n+    name = ctx.attr.name\n+    outputs_tar = ctx.attr.name + \"_out.tar\"\n+\n+    # Pull the image using 'docker pull'\n+    _pull_image(ctx)\n+    image_id = _RBE_UBUNTU_GCR + ctx.attr.digest\n+\n+    bazel_version = None\n+    bazel_rc_version = None\n+    if ctx.attr.bazel_version == \"local\":\n+        check_bazel_version()\n+        bazel_version = str(extract_version_number(native.bazel_version))\n+        rc = parse_rc(native.bazel_version)\n+        bazel_rc_version = rc if rc != -1 else None\n+    if ctx.attr.bazel_version != \"local\":\n+        bazel_version = ctx.attr.bazel_version\n+        bazel_rc_version = ctx.attr.bazel_rc_version\n+\n+    # run the container and extract the autoconf directory\n+    _run_and_extract(\n+        ctx,\n+        bazel_version = bazel_version,\n+        bazel_rc_version = bazel_rc_version,\n+        image_id = image_id,\n+        outputs_tar = outputs_tar,\n+        project_root = project_root,\n+        use_default_project = use_default_project,\n+    )\n+\n+    # Create a default BUILD file with the platform + toolchain targets that\n+    # will work with RBE with the produced toolchain\n+    _create_platform(ctx, bazel_version = bazel_version, name = name)\n+\n+    # Expand outputs to project dir if user requested it\n+    _expand_outputs(\n+        ctx,\n+        bazel_version = bazel_version,\n+        project_root = project_root,\n+    )\n+\n+# Convenience method to print results of execute (and fail on errors if needed).\n+# Verbose logging is enabled via a global var in this bzl file.\n+def _print_exec_results(prefix, exec_result, fail = False, args = None):\n+    if _VERBOSE and exec_result.return_code != 0:\n+        print(prefix + \"::error::\" + exec_result.stderr)\n+    elif _VERBOSE:\n+        print(prefix + \"::success::\" + exec_result.stdout)\n+    if fail and exec_result.return_code != 0:\n+        if _VERBOSE and args:\n+            print(\"failed to run execute with the following args:\" + str(args))\n+        fail(\"Failed to run:\" + prefix + \":\" + exec_result.stderr)\n+\n+# Perform validations of host environment to be able to run the rule.\n+def _validate_host(ctx):\n+    if ctx.os.name.lower() != \"linux\":\n+        fail(\"Not running on linux host, cannot run rbe_autoconfig.\")\n+    if not ctx.which(\"docker\"):\n+        fail(\"Cannot run rbe_autoconfig as 'docker' was not found on the path.\")\n+    if ctx.execute([\"docker\", \"ps\"]).return_code != 0:\n+        fail(\"Cannot run rbe_autoconfig as running 'docker ps' returned a \" +\n+             \"non 0 exit code, please check you have permissions to run docker.\")\n+    if not ctx.which(\"tar\"):\n+        fail(\"Cannot run rbe_autoconfig as 'tar' was not found on the path.\")\n+\n+# Pulls an image using 'docker pull'.\n+def _pull_image(ctx):\n+    print(\"Pulling image.\")\n+    result = ctx.execute([\"docker\", \"pull\", _RBE_UBUNTU_GCR + ctx.attr.digest])\n+    _print_exec_results(\"pull image\", result, fail = True)\n+    print(\"Image pulled.\")\n+\n+# Creates file \"container/run_in_container.sh\" which can be mounted onto container\n+# to run the commands to install bazel, run it and create the output tar\n+def _create_docker_cmd(\n+        ctx,\n+        bazel_version,\n+        bazel_rc_version,\n+        outputs_tar,\n+        use_default_project):\n+    # Command to install Bazel version\n+    # If a specific Bazel and Bazel RC version is specified, install that version.\n+    bazel_url = \"https://releases.bazel.build/\" + bazel_version\n+    if bazel_rc_version:\n+        bazel_url += (\"/rc\" + bazel_rc_version +\n+                      \"/bazel-\" + bazel_version + \"rc\" +\n+                      bazel_rc_version)\n+    else:\n+        bazel_url += \"/release/bazel-\" + bazel_version\n+    bazel_url += \"-installer-linux-x86_64.sh\"\n+    install_bazel_cmd = [\"bazel_url=\" + bazel_url]\n+    install_bazel_cmd += [\"mkdir -p /src/bazel\"]\n+    install_bazel_cmd += [\"cd /src/bazel/\"]\n+    install_bazel_cmd += [\"wget $bazel_url --no-verbose --ca-certificate=/etc/ssl/certs/ca-certificates.crt -O /tmp/bazel-installer.sh\"]\n+    install_bazel_cmd += [\"chmod +x /tmp/bazel-installer.sh\"]\n+    install_bazel_cmd += [\"/tmp/bazel-installer.sh\"]\n+    install_bazel_cmd += [\"rm -f /tmp/bazel-installer.sh\"]\n+\n+    # Command to recursively convert soft links to hard links in the config_repos\n+    deref_symlinks_cmd = []\n+    for config_repo in _CONFIG_REPOS:\n+        symlinks_cmd = (\"find $(bazel info output_base)/\" +\n+                        _EXTERNAL_FOLDER_PREFIX + config_repo +\n+                        \" -type l -exec bash -c 'ln -f \\\"$(readlink -m \\\"$0\\\")\\\" \\\"$0\\\"' {} \\;\")\n+        deref_symlinks_cmd.append(symlinks_cmd)\n+    deref_symlinks_cmd = \" && \".join(deref_symlinks_cmd)\n+\n+    # Command to copy produced toolchain configs to a tar at the root\n+    # of the container.\n+    copy_cmd = [\"mkdir \" + _OUTPUT_DIR]\n+    for config_repo in _CONFIG_REPOS:\n+        src_dir = \"$(bazel info output_base)/\" + _EXTERNAL_FOLDER_PREFIX + config_repo\n+        copy_cmd.append(\"cp -dr \" + src_dir + \" \" + _OUTPUT_DIR)\n+    copy_cmd.append(\"tar -cf /\" + outputs_tar + \" -C \" + _OUTPUT_DIR + \"/ . \")\n+    output_copy_cmd = \" && \".join(copy_cmd)\n+\n+    # if use_default_project was selected, we need to modify the WORKSPACE and BUILD file\n+    setup_default_project_cmd = [\"cd .\"]\n+    if use_default_project:\n+        setup_default_project_cmd += [\"cd \" + _BAZEL_CONFIG_DIR + \"/\" + _PROJECT_REPO_DIR]\n+        setup_default_project_cmd += [\"mv BUILD.sample BUILD\"]\n+        setup_default_project_cmd += [\"touch WORKSPACE\"]\n+\n+    bazel_cmd = \"cd \" + _BAZEL_CONFIG_DIR + \"/\" + _PROJECT_REPO_DIR\n+\n+    # For each config repo we run the target @<config_repo>//...\n+    bazel_targets = \"@\" + \"//... @\".join(_CONFIG_REPOS) + \"//...\"\n+    bazel_flags = \"\"\n+    if not ctx.attr.incompatible_changes_off:\n+        bazel_flags += \" --all_incompatible_changes\"\n+    bazel_cmd += \" && bazel build \" + bazel_flags + \" \" + bazel_targets\n+\n+    # Command to run to clean up after autoconfiguration.\n+    # we start with \"cd .\" to make sure in case of failure everything after the\n+    # \";\" will be executed\n+    clean_cmd = \"cd . ; bazel clean\"\n+    if use_default_project:\n+        clean_cmd += \"; rm WORKSPACE ; mv BUILD BUILD.sample\"\n+\n+    docker_cmd = [\n+        \"#!/bin/bash\",\n+        \"echo === Starting docker autoconfig ===\",\n+        ctx.attr.setup_cmd,\n+    ]\n+    docker_cmd += install_bazel_cmd\n+    docker_cmd += setup_default_project_cmd\n+    docker_cmd += [\n+        bazel_cmd,\n+        deref_symlinks_cmd,\n+        output_copy_cmd,\n+        clean_cmd,\n+    ]","path":"rules/rbe_repo.bzl","position":340,"original_position":340,"commit_id":"cafba9d24bbe43d3fa94fe10b54be39592be11f1","original_commit_id":"cafba9d24bbe43d3fa94fe10b54be39592be11f1","user":{"login":"xingao267","id":10503762,"node_id":"MDQ6VXNlcjEwNTAzNzYy","avatar_url":"https://avatars3.githubusercontent.com/u/10503762?v=4","gravatar_id":"","url":"https://api.github.com/users/xingao267","html_url":"https://github.com/xingao267","followers_url":"https://api.github.com/users/xingao267/followers","following_url":"https://api.github.com/users/xingao267/following{/other_user}","gists_url":"https://api.github.com/users/xingao267/gists{/gist_id}","starred_url":"https://api.github.com/users/xingao267/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xingao267/subscriptions","organizations_url":"https://api.github.com/users/xingao267/orgs","repos_url":"https://api.github.com/users/xingao267/repos","events_url":"https://api.github.com/users/xingao267/events{/privacy}","received_events_url":"https://api.github.com/users/xingao267/received_events","type":"User","site_admin":false},"body":"why not\r\n    docker_cmd = [\r\n        \"#!/bin/bash\",\r\n        \"echo === Starting docker autoconfig ===\",\r\n        ctx.attr.setup_cmd,\r\n        install_bazel_cmd,\r\n        setup_default_project_cmd,\r\n        bazel_cmd,\r\n        deref_symlinks_cmd,\r\n        output_copy_cmd,\r\n        clean_cmd,\r\n    ]","created_at":"2018-12-13T18:17:23Z","updated_at":"2018-12-13T18:21:54Z","html_url":"https://github.com/bazelbuild/bazel-toolchains/pull/260#discussion_r241508575","pull_request_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/260","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/comments/241508575"},"html":{"href":"https://github.com/bazelbuild/bazel-toolchains/pull/260#discussion_r241508575"},"pull_request":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/260"}}},"pull_request":{"url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/260","id":238181256,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM4MTgxMjU2","html_url":"https://github.com/bazelbuild/bazel-toolchains/pull/260","diff_url":"https://github.com/bazelbuild/bazel-toolchains/pull/260.diff","patch_url":"https://github.com/bazelbuild/bazel-toolchains/pull/260.patch","issue_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/issues/260","number":260,"state":"open","locked":false,"title":"Autoconf repo rule","user":{"login":"nlopezgi","id":4062751,"node_id":"MDQ6VXNlcjQwNjI3NTE=","avatar_url":"https://avatars3.githubusercontent.com/u/4062751?v=4","gravatar_id":"","url":"https://api.github.com/users/nlopezgi","html_url":"https://github.com/nlopezgi","followers_url":"https://api.github.com/users/nlopezgi/followers","following_url":"https://api.github.com/users/nlopezgi/following{/other_user}","gists_url":"https://api.github.com/users/nlopezgi/gists{/gist_id}","starred_url":"https://api.github.com/users/nlopezgi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nlopezgi/subscriptions","organizations_url":"https://api.github.com/users/nlopezgi/orgs","repos_url":"https://api.github.com/users/nlopezgi/repos","events_url":"https://api.github.com/users/nlopezgi/events{/privacy}","received_events_url":"https://api.github.com/users/nlopezgi/received_events","type":"User","site_admin":false},"body":"Create new repository rule to replace completely our process to publish toolchain configs and platforms. \r\nSee doc in rule for full explanation of how it works (that info should be sufficient to understand as an external customer what to do).\r\n\r\nSorry this is a massive PR, tried to break down code into separate functions to make it easy to parse. ","created_at":"2018-12-12T21:02:40Z","updated_at":"2018-12-13T18:21:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d55a980ebccf3c0598c26f207cac68b2f57526ab","assignee":null,"assignees":[],"requested_reviewers":[{"login":"alex1545","id":42874203,"node_id":"MDQ6VXNlcjQyODc0MjAz","avatar_url":"https://avatars0.githubusercontent.com/u/42874203?v=4","gravatar_id":"","url":"https://api.github.com/users/alex1545","html_url":"https://github.com/alex1545","followers_url":"https://api.github.com/users/alex1545/followers","following_url":"https://api.github.com/users/alex1545/following{/other_user}","gists_url":"https://api.github.com/users/alex1545/gists{/gist_id}","starred_url":"https://api.github.com/users/alex1545/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alex1545/subscriptions","organizations_url":"https://api.github.com/users/alex1545/orgs","repos_url":"https://api.github.com/users/alex1545/repos","events_url":"https://api.github.com/users/alex1545/events{/privacy}","received_events_url":"https://api.github.com/users/alex1545/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/260/commits","review_comments_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/260/comments","review_comment_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/issues/260/comments","statuses_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/statuses/cafba9d24bbe43d3fa94fe10b54be39592be11f1","head":{"label":"nlopezgi:autoconfRepoRule","ref":"autoconfRepoRule","sha":"cafba9d24bbe43d3fa94fe10b54be39592be11f1","user":{"login":"nlopezgi","id":4062751,"node_id":"MDQ6VXNlcjQwNjI3NTE=","avatar_url":"https://avatars3.githubusercontent.com/u/4062751?v=4","gravatar_id":"","url":"https://api.github.com/users/nlopezgi","html_url":"https://github.com/nlopezgi","followers_url":"https://api.github.com/users/nlopezgi/followers","following_url":"https://api.github.com/users/nlopezgi/following{/other_user}","gists_url":"https://api.github.com/users/nlopezgi/gists{/gist_id}","starred_url":"https://api.github.com/users/nlopezgi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nlopezgi/subscriptions","organizations_url":"https://api.github.com/users/nlopezgi/orgs","repos_url":"https://api.github.com/users/nlopezgi/repos","events_url":"https://api.github.com/users/nlopezgi/events{/privacy}","received_events_url":"https://api.github.com/users/nlopezgi/received_events","type":"User","site_admin":false},"repo":{"id":124305808,"node_id":"MDEwOlJlcG9zaXRvcnkxMjQzMDU4MDg=","name":"bazel-toolchains","full_name":"nlopezgi/bazel-toolchains","private":false,"owner":{"login":"nlopezgi","id":4062751,"node_id":"MDQ6VXNlcjQwNjI3NTE=","avatar_url":"https://avatars3.githubusercontent.com/u/4062751?v=4","gravatar_id":"","url":"https://api.github.com/users/nlopezgi","html_url":"https://github.com/nlopezgi","followers_url":"https://api.github.com/users/nlopezgi/followers","following_url":"https://api.github.com/users/nlopezgi/following{/other_user}","gists_url":"https://api.github.com/users/nlopezgi/gists{/gist_id}","starred_url":"https://api.github.com/users/nlopezgi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nlopezgi/subscriptions","organizations_url":"https://api.github.com/users/nlopezgi/orgs","repos_url":"https://api.github.com/users/nlopezgi/repos","events_url":"https://api.github.com/users/nlopezgi/events{/privacy}","received_events_url":"https://api.github.com/users/nlopezgi/received_events","type":"User","site_admin":false},"html_url":"https://github.com/nlopezgi/bazel-toolchains","description":null,"fork":true,"url":"https://api.github.com/repos/nlopezgi/bazel-toolchains","forks_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/forks","keys_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/teams","hooks_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/hooks","issue_events_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/issues/events{/number}","events_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/events","assignees_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/assignees{/user}","branches_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/branches{/branch}","tags_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/tags","blobs_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/git/refs{/sha}","trees_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/statuses/{sha}","languages_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/languages","stargazers_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/stargazers","contributors_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/contributors","subscribers_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/subscribers","subscription_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/subscription","commits_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/commits{/sha}","git_commits_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/git/commits{/sha}","comments_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/comments{/number}","issue_comment_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/issues/comments{/number}","contents_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/contents/{+path}","compare_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/merges","archive_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/downloads","issues_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/issues{/number}","pulls_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/pulls{/number}","milestones_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/milestones{/number}","notifications_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/labels{/name}","releases_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/releases{/id}","deployments_url":"https://api.github.com/repos/nlopezgi/bazel-toolchains/deployments","created_at":"2018-03-07T23:12:21Z","updated_at":"2018-12-07T15:30:24Z","pushed_at":"2018-12-13T14:59:07Z","git_url":"git://github.com/nlopezgi/bazel-toolchains.git","ssh_url":"git@github.com:nlopezgi/bazel-toolchains.git","clone_url":"https://github.com/nlopezgi/bazel-toolchains.git","svn_url":"https://github.com/nlopezgi/bazel-toolchains","homepage":null,"size":867,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"bazelbuild:master","ref":"master","sha":"999a4d472d5bf98437ed0a108c874efcfd014f93","user":{"login":"bazelbuild","id":11684617,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNjg0NjE3","avatar_url":"https://avatars1.githubusercontent.com/u/11684617?v=4","gravatar_id":"","url":"https://api.github.com/users/bazelbuild","html_url":"https://github.com/bazelbuild","followers_url":"https://api.github.com/users/bazelbuild/followers","following_url":"https://api.github.com/users/bazelbuild/following{/other_user}","gists_url":"https://api.github.com/users/bazelbuild/gists{/gist_id}","starred_url":"https://api.github.com/users/bazelbuild/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bazelbuild/subscriptions","organizations_url":"https://api.github.com/users/bazelbuild/orgs","repos_url":"https://api.github.com/users/bazelbuild/repos","events_url":"https://api.github.com/users/bazelbuild/events{/privacy}","received_events_url":"https://api.github.com/users/bazelbuild/received_events","type":"Organization","site_admin":false},"repo":{"id":95790423,"node_id":"MDEwOlJlcG9zaXRvcnk5NTc5MDQyMw==","name":"bazel-toolchains","full_name":"bazelbuild/bazel-toolchains","private":false,"owner":{"login":"bazelbuild","id":11684617,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNjg0NjE3","avatar_url":"https://avatars1.githubusercontent.com/u/11684617?v=4","gravatar_id":"","url":"https://api.github.com/users/bazelbuild","html_url":"https://github.com/bazelbuild","followers_url":"https://api.github.com/users/bazelbuild/followers","following_url":"https://api.github.com/users/bazelbuild/following{/other_user}","gists_url":"https://api.github.com/users/bazelbuild/gists{/gist_id}","starred_url":"https://api.github.com/users/bazelbuild/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bazelbuild/subscriptions","organizations_url":"https://api.github.com/users/bazelbuild/orgs","repos_url":"https://api.github.com/users/bazelbuild/repos","events_url":"https://api.github.com/users/bazelbuild/events{/privacy}","received_events_url":"https://api.github.com/users/bazelbuild/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/bazelbuild/bazel-toolchains","description":"Repository that hosts Bazel toolchain configs for remote execution and related support tools.","fork":false,"url":"https://api.github.com/repos/bazelbuild/bazel-toolchains","forks_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/forks","keys_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/teams","hooks_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/hooks","issue_events_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/issues/events{/number}","events_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/events","assignees_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/assignees{/user}","branches_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/branches{/branch}","tags_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/tags","blobs_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/git/refs{/sha}","trees_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/statuses/{sha}","languages_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/languages","stargazers_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/stargazers","contributors_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/contributors","subscribers_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/subscribers","subscription_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/subscription","commits_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/commits{/sha}","git_commits_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/git/commits{/sha}","comments_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/comments{/number}","issue_comment_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/issues/comments{/number}","contents_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/contents/{+path}","compare_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/merges","archive_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/downloads","issues_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/issues{/number}","pulls_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls{/number}","milestones_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/milestones{/number}","notifications_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/labels{/name}","releases_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/releases{/id}","deployments_url":"https://api.github.com/repos/bazelbuild/bazel-toolchains/deployments","created_at":"2017-06-29T15:13:48Z","updated_at":"2018-12-07T16:29:10Z","pushed_at":"2018-12-13T14:59:08Z","git_url":"git://github.com/bazelbuild/bazel-toolchains.git","ssh_url":"git@github.com:bazelbuild/bazel-toolchains.git","clone_url":"https://github.com/bazelbuild/bazel-toolchains.git","svn_url":"https://github.com/bazelbuild/bazel-toolchains","homepage":"","size":731,"stargazers_count":35,"watchers_count":35,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":29,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":29,"open_issues":2,"watchers":35,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/260"},"html":{"href":"https://github.com/bazelbuild/bazel-toolchains/pull/260"},"issue":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/issues/260"},"comments":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/issues/260/comments"},"review_comments":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/260/comments"},"review_comment":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/pulls/260/commits"},"statuses":{"href":"https://api.github.com/repos/bazelbuild/bazel-toolchains/statuses/cafba9d24bbe43d3fa94fe10b54be39592be11f1"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"xingao267"}}