)]}'
{
  "commit": "ed7ced0018dc5c5ebd6fc8afc7158037ac1df00d",
  "tree": "e5f84250381e2e82020c1e730af8f7f6dceeaf88",
  "parents": [
    "df72d2c47d54d296400d1e3cf2ac782b3d93e8bb"
  ],
  "author": {
    "name": "Justine Tunney",
    "email": "jart@google.com",
    "time": "Tue Nov 29 18:29:37 2016 +0000"
  },
  "committer": {
    "name": "Kristina Chodorow",
    "email": "kchodorow@google.com",
    "time": "Tue Nov 29 19:56:27 2016 +0000"
  },
  "message": "Support multiple mirror URLs for external repos\n\nThis change improves upon 4c67807964e37cfd55bbcda4c6374fcc480bcecc.\n\n- A urls attribute has been added to the native workspace rules, with\n  the exception of maven_jar and git_repository. The Skylark repository\n  API also supports multiple URLs now.\n\n- The earlier mirrors in the list are preferred. Failover will happen\n  automatically in parallel.\n\n- The first 32kB of data is checked before choosing a mirror in order\n  to evade captive portals.\n\n- If one\u0027s Internet goes down or a download times out, then the\n  download will resume automatically where it left off, provided the\n  server supports RFC7233 for that particular file. Please note that\n  GitHub does not support this for archive snapshots. Files should\n  always be mirrored to a CDN, e.g. GCS, because they support this.\n\n- A semaphore is now used on downloads so only 8 can happen at once.\n\nFixes #1814\nFixes #2131\nFixes #2008\nFixes #1968\nFixes #1717\nFixes #943\nWont fix #1194\nFixes tensorflow/tensorflow#5933\nFixes tensorflow/tensorflow#5924\nFixes tensorflow/tensorflow#5924\nFixes tensorflow/tensorflow#5432\nSee #1607\nSee #821\nSee tensorflow/tensorflow#5080\nSee tensorflow/tensorflow#5029\nSee tensorflow/tensorflow#4583\nSee tensorflow/tensorflow#4058\n\nRELNOTES: A urls attribute has been added to repository rules to support multiple mirror URLs for reliably downloading files.\n\n--\nMOS_MIGRATED_REVID\u003d140495736\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "0d78adcb5fd9febe871b1f37af22c2d83787e043",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java",
      "new_id": "47fa3f3eb7097f993c44b14c20d49b783a6c2f35",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java"
    },
    {
      "type": "modify",
      "old_id": "12ff3966eecc3e2057e3c7063766e0bc06be7e56",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/GitCloner.java",
      "new_id": "9b347ae63982e8fbe0de52657edf27673ac1097f",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/GitCloner.java"
    },
    {
      "type": "modify",
      "old_id": "64cdfdf14a1e04ec04de137981526f3080adb57e",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/cache/RepositoryCache.java",
      "new_id": "bd743b3532b8f3a9348fbd3d66f55576f4859b93",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/cache/RepositoryCache.java"
    },
    {
      "type": "modify",
      "old_id": "82f39cc92834ed1216e57a9418ead48b60afd9dc",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD",
      "new_id": "c4ebcf0476d0f6c9f00abf17df0b6017949349a1",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ee7b1bd0c493f12ef16c6557845a6c846f309287",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HashInputStream.java"
    },
    {
      "type": "modify",
      "old_id": "c055f6f577e79f5160449c3968f8a8df00a7fde7",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnector.java",
      "new_id": "ba2c64f424db088449fe53f3becfc1990060da87",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnector.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ac0c080cfd16674ec0098a193b0fe7a272856b17",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorMultiplexer.java"
    },
    {
      "type": "modify",
      "old_id": "ea4cc81d7c8455bba7e56d48e166bc16ead9ed9f",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java",
      "new_id": "7ed6a924ba3d77646baaf5bf5fec34cf3e1cad7e",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4921b1504fe4368eb4bd7e948d5428c4e4618efc",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpStream.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5c558d6f18512da597743d0c884b93b1d9e0ddf4",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpUtils.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "81158e3a47eecd9a7c0879e65e6cfd769383cee2",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/InterruptibleInputStream.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "acaf3e069711b25df9f75abca81d146c39970eb2",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/ProgressInputStream.java"
    },
    {
      "type": "modify",
      "old_id": "fd0936989cea885fdd39ad3580b6966ad3617f91",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/ProxyHelper.java",
      "new_id": "1ae265b89c017a0f2560e1e259d6c268dd11eea4",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/ProxyHelper.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4263cc257fad0714c40e8b6d3d8e5d1c369ff76f",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/RetryingInputStream.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3ccd2f4a2c96e3afab5104141489aa73c672dd7d",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/UnrecoverableHttpException.java"
    },
    {
      "type": "modify",
      "old_id": "97b295f2c4220c48496e4869ef8b45da6a231c5e",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java",
      "new_id": "95e85324291aa13650aabdd2303355d3316b935e",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java"
    },
    {
      "type": "modify",
      "old_id": "0406fabf8e4ea5dce9a74f3341e5daf326be2071",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/rules/workspace/HttpArchiveRule.java",
      "new_id": "3734725a08801587a4bddb11302f102ae4db65be",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/rules/workspace/HttpArchiveRule.java"
    },
    {
      "type": "modify",
      "old_id": "7c96c4cc329fe40fc744411cf60465b385e749c4",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/rules/workspace/HttpFileRule.java",
      "new_id": "9ef7b0d3fe0b7e79affbbd8b0b497b7667689866",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/rules/workspace/HttpFileRule.java"
    },
    {
      "type": "modify",
      "old_id": "30a5cd8b419a52fb6df68b44c05ddfcea3217f20",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/bazel/rules/workspace/NewHttpArchiveRule.java",
      "new_id": "9f29fd61567f087b52488aa220429f58157049e6",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/bazel/rules/workspace/NewHttpArchiveRule.java"
    },
    {
      "type": "modify",
      "old_id": "65b890d45aac29d8d26f0fca0b9bec42bb00d4ba",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java",
      "new_id": "d7856e8cf7f2c4521af242fd46773684b75ba08e",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java"
    },
    {
      "type": "modify",
      "old_id": "b2edf3d96c00236ab53dc49281a988c06f6e5b71",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceAttributeMapper.java",
      "new_id": "99cc363e9c0b4974dbebdb299558de2744c5f571",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceAttributeMapper.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d31c617412334eb16b22a7072e41ec0897711973",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/util/JavaSleeper.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "53b29d20e8cccc289a411e077507764fda4a1315",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/util/Sleeper.java"
    },
    {
      "type": "modify",
      "old_id": "6d9253a2620dca39b614e72ad8e9a93f8664392f",
      "old_mode": 33188,
      "old_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD",
      "new_id": "ceaaf305bfae7b0f4b8283f6340d8d23dbad2439",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD"
    },
    {
      "type": "modify",
      "old_id": "1a48a1ceb50185d5d50ec37266e12b1777f2bfae",
      "old_mode": 33188,
      "old_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/DownloaderTestSuite.java",
      "new_id": "1c2477e64b92b30fad94ff635e04d08935f26797",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/DownloaderTestSuite.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1f55667efa72f63ff3685710ef3b4565de2decfb",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/DownloaderTestUtils.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c1e14df90785ec5d080996e79ae10de8b45b712f",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HashInputStreamTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b5b77a28cf0b0b4c7b51bff127dfa3fc9762c2c5",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorMultiplexerIntegrationTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dedf3168680176df97e679b531269ce704f2275c",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorMultiplexerTest.java"
    },
    {
      "type": "modify",
      "old_id": "fa5a1b6bb6157c28bfabcaf8775774f48021fa32",
      "old_mode": 33188,
      "old_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorTest.java",
      "new_id": "ccc50196d748289a4ae4c1dd94d86c073eda56ab",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c901367acaafbd50d59adc9222837f6c60cb19b7",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpParser.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ac0351ed18d546342de4fede67052427caf7b228",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpStreamTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b79cbc524475a47c13ae08eee08fdb3f889f6cea",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpUtilsTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2e047f773ff619e6dfaa7fe7f779afa21d2b4959",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/ProgressInputStreamTest.java"
    },
    {
      "type": "modify",
      "old_id": "2a725c195a3c73bfe1cb42fac5f35e71894c984f",
      "old_mode": 33188,
      "old_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/ProxyHelperTest.java",
      "new_id": "6063ae5054fc978e2e638a23fad783995771d266",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/ProxyHelperTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "10f0923dcb7cca1a65a8c8f4171806f52cad5487",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/RetryingInputStreamTest.java"
    },
    {
      "type": "modify",
      "old_id": "15752cc2ef19174c818fb6337ab61bc4fc29ac70",
      "old_mode": 33188,
      "old_path": "src/test/java/com/google/devtools/build/lib/testutil/ManualClock.java",
      "new_id": "fe500d0464aa35a29d52750cfd9ee04552b4a49c",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/testutil/ManualClock.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6e1625349909ca5620f2489472c0d81a6102933f",
      "new_mode": 33188,
      "new_path": "src/test/java/com/google/devtools/build/lib/testutil/ManualSleeper.java"
    },
    {
      "type": "modify",
      "old_id": "0f610e050c585f5d720dd6c39621c5337d868d29",
      "old_mode": 33261,
      "old_path": "src/test/shell/bazel/external_integration_test.sh",
      "new_id": "52b01a1fb2e38df136b86a514f9a087a565d6718",
      "new_mode": 33261,
      "new_path": "src/test/shell/bazel/external_integration_test.sh"
    }
  ]
}
