)]}'
{
  "log": [
    {
      "commit": "2b80cf780ae31bee6609ebc1bbab9ce6fd004dbe",
      "tree": "fc8b7577a926dd354b4e9d8bbf71a5f7ae217a54",
      "parents": [
        "033e616ee22e0a03b1346d92a599ce96691625fc"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:49:21 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:56:46 2013 -0800"
      },
      "message": "Make sure StepFailedException includes full description.\n\nSummary:\nI saw this while developing and decided the error message could\nhave been more helpful.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "033e616ee22e0a03b1346d92a599ce96691625fc",
      "tree": "a70f9f37d9eaec9e3d478ccf4fdd7d6398ab42ae",
      "parents": [
        "924dfa5256f7312ffc053eef101003560985ffd7"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 19 10:32:55 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:46:04 2013 -0800"
      },
      "message": "Remove `@Nullable` annotation from `escapeJavaType` method.\n\nSummary:\nThe type parameter is annotated with @Nullable, but the parameter\nshould not actually be null because it is being dereferenced within\nthe method.\n\nRemove the annotation.\n\nhttps://github.com/facebook/buck/pull/60\n\nTest Plan: Run some test builds.\n"
    },
    {
      "commit": "924dfa5256f7312ffc053eef101003560985ffd7",
      "tree": "97d7f9192cc81798e8062091734c0093949bbca1",
      "parents": [
        "aef9fbf944a750582eb67244ba1b191c84fa1d1e"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 19 18:04:11 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:45:58 2013 -0800"
      },
      "message": "Improve the bash completion script installation instructions.\n\nSummary:\nOn some distributions there is a specific folder in which the script should\nbe placed, rather than adding the `source` command in the user profile.\n\nhttps://github.com/facebook/buck/pull/56\n\nTest Plan: Follow the instructions and make sure it works as expected.\n"
    },
    {
      "commit": "aef9fbf944a750582eb67244ba1b191c84fa1d1e",
      "tree": "df08704c2a25ac366b7b8cefb954b3b36359554e",
      "parents": [
        "29aeb58f05140d3068a90476e995f5baad13c507"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 16:37:35 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:45:52 2013 -0800"
      },
      "message": "Modify UberRDotJavaUtil.getAndroidResourceDeps() so it no longer needs a DependencyGraph.\n\nSummary:\nThis makes `UberRDotJavaUtil` more general, which will make it easier to repurpose for\nuse by a standalone `aapt package` rule.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "29aeb58f05140d3068a90476e995f5baad13c507",
      "tree": "721120b5b2bcb0ad6a74ca56f923bfc765d41001",
      "parents": [
        "5254e5e285f56f6b22c73682b73ca4461e3122ec"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 16:04:38 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:45:47 2013 -0800"
      },
      "message": "Improve CopyStep\u0027s error message.\n\nSummary:\nI saw this while developing, and I was not sure what was attempted\nto be copied.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "5254e5e285f56f6b22c73682b73ca4461e3122ec",
      "tree": "a1b2d3025041a3588bddc3b6758bd650d4085ffa",
      "parents": [
        "8a7ce4451bf644c3a60b613e0c9ae976c5fe584b"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Tue Nov 19 15:33:45 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:45:38 2013 -0800"
      },
      "message": "Change exportDeps boolean to list exportedDeps.\n\nTest Plan: Unit tests.\n"
    },
    {
      "commit": "8a7ce4451bf644c3a60b613e0c9ae976c5fe584b",
      "tree": "32f0e9d8579cbb9a7b3585497edc1a958fafe113",
      "parents": [
        "2342facdb0658113e9cfffd7c07cb5f3adfcfb84"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Tue Nov 19 14:48:43 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:45:31 2013 -0800"
      },
      "message": "More fixes for WARN_ON_TRANSITIVE.\n\nSummary: Suggesting importing a export_dep first was broken.\n\nTest Plan: Unit tests.\n"
    },
    {
      "commit": "2342facdb0658113e9cfffd7c07cb5f3adfcfb84",
      "tree": "04441fcc69bb4ee921c67befe8638e9ebbc97eac",
      "parents": [
        "10f50e21592ade83f5af833cda687dad917b536b"
      ],
      "author": {
        "name": "Jim Purbrick",
        "email": "jimp@fb.com",
        "time": "Tue Nov 19 11:39:26 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:45:22 2013 -0800"
      },
      "message": "Update NailGun to a version that supports a configurable client disconnection timeout.\n\nSummary:\nUpdate nailgun to 5915c1f84c70dc763627dfde549c7ab07d712164,\nmodify buckd script to pass timeout to NailGun server.\n\nTest Plan:\n0) buck test --all\n1) buckd\n2) buck build buck, check that it completes\n3) modify buckd script to set BUCKD_CLIENT_TIMEOUT_MILLIS to 500\n4) buckd\n5) buck build buck, check that build exits with \"Client disconnected.\" message.\n"
    },
    {
      "commit": "10f50e21592ade83f5af833cda687dad917b536b",
      "tree": "935cd45da70f8e63f32e09d5e65e154c38e27b49",
      "parents": [
        "82caef4a7e6004910d491500aa8a7ef266e25f3d"
      ],
      "author": {
        "name": "George Papastamatopoulos",
        "email": "george.papas@gmail.com",
        "time": "Tue Nov 19 11:32:25 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:45:16 2013 -0800"
      },
      "message": "Ensure onCreate calls through to super.onCreate().\n\nSummary:\nQuick Start docs create an activity that does not call through to\nsuper.onCreate and causes the sample Hello World app to crash.\n\nhttps://github.com/facebook/buck/pull/53\n\nTest Plan: http://localhost:9811/setup/manual_quick_start.html\n"
    },
    {
      "commit": "82caef4a7e6004910d491500aa8a7ef266e25f3d",
      "tree": "9e573a590a1c70fe6fae6ecf19d4a33bbb0a9b23",
      "parents": [
        "fadb1e984d6d533a46a2d27201dc607a1a15d4ee"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 19 11:23:12 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:44:59 2013 -0800"
      },
      "message": "Handle KeyboardInterrupt in buck.py.\n\nSummary:\nTerminating a buck build with CTRL-C sometimes results in a Python\nTraceback being shown on the terminal.\n\nFix this by catching KeyboardInterrupt in the main() method. Don\u0027t\ndo anything with the caught exception; just pass.\n\nTest Plan: Build something. Terminate it with CTRL-C. Don\u0027t see a TraceBack.\n"
    },
    {
      "commit": "fadb1e984d6d533a46a2d27201dc607a1a15d4ee",
      "tree": "5e329be5bf0c2791294b90748c200cb1ed27353e",
      "parents": [
        "3169c093559b129813bbb0075254764e3f97cd08"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 19 11:22:10 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:44:49 2013 -0800"
      },
      "message": "Redundant format arg in resolveFilePathRelativeToBuildFileDirectory.\n\nSummary:\nIn method resolveFilePathRelativeToBuildFileDirectory, String.format\nis called with 3 arguments, but the string format only expects 2.\n\nRemove the redundant one.\n\nhttps://github.com/facebook/buck/pull/61\n\nTest Plan: Unit tests, sandcastle\n"
    },
    {
      "commit": "3169c093559b129813bbb0075254764e3f97cd08",
      "tree": "40ea4b71466e176db785a54c4b07d5ad8b4815e4",
      "parents": [
        "8a7132c9735e5c90cc1e3dbeaf77dff11b620b6d"
      ],
      "author": {
        "name": "Natthu Bharambe",
        "email": "natthu@fb.com",
        "time": "Fri Nov 15 05:17:48 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:44:37 2013 -0800"
      },
      "message": "Update the strings asset file format for easier parsing.\n\nSummary:\nThe new file format makes it so that parsing sections of the file one at a time\nbecomes easier.\nAlso, switch some of the `byte` and `short` to `int` to make it more flexible.\nIntentionally left the `byte` data type in plurals since the number of plural\ncategories is guaranteed to be \u003c\u003d 6.\n\nTo make it easier to maintain the unit test, I changed the file format to\nsomething easy to understand/edit.\n\nTest Plan: ant test\n"
    },
    {
      "commit": "8a7132c9735e5c90cc1e3dbeaf77dff11b620b6d",
      "tree": "34cea078ed05e2ba41cfdff9d01ea5f1b26f65db",
      "parents": [
        "cd985d1de43d48c6d7a51dafcc4f05ff5e38ac6a"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 09:03:31 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:44:29 2013 -0800"
      },
      "message": "Update android_binary to take a SourcePath for its manifest parameter.\n\nSummary:\nIn practice, we have been using genfile() to use a generated file as\na manifest for an android_binary(). This relaxes android_binary() to\naccept a SourcePath, which will help us start to do away with genfile().\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "cd985d1de43d48c6d7a51dafcc4f05ff5e38ac6a",
      "tree": "4385e1ce183e00ac8ad05e8414803600902e0bb8",
      "parents": [
        "ce81d152adbc1853dde0346366b1280e1e577a88"
      ],
      "author": {
        "name": "Simon Stewart",
        "email": "simons@fb.com",
        "time": "Tue Nov 19 02:35:54 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:44:23 2013 -0800"
      },
      "message": "Handle nulls gracefully in the JavaTestRule when reporting errors.\n\nSummary:\nIt\u0027s possible for the rule to be null when trying to figure out whether the source under\ntest is a java library rule. Handle this without causing buck to blow up.\n\nTest Plan: Visual inspection of the code.\n"
    },
    {
      "commit": "ce81d152adbc1853dde0346366b1280e1e577a88",
      "tree": "d55c3164fce8d42b44366bcd033ec5fdc835f93a",
      "parents": [
        "14dee1a1610df577013846fd7b7ec0b2b189667c"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 18 17:27:43 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:44:15 2013 -0800"
      },
      "message": "Refactor graph enhancement logic into AndroidBinaryGraphEnhancer.\n\nSummary:\nThis makes the graph enhancement logic easier to unit test, and helps\nensure that it does not modify the `AndroidBinaryRule.Builder` from which\nit is used. Its only side-effect is that it updates the `BuildRuleResolver`\nthat is passed in, but now that distinction is clearer.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "14dee1a1610df577013846fd7b7ec0b2b189667c",
      "tree": "6bf0a13974c3aad02158214e953838dd0ee9cdfc",
      "parents": [
        "80dda7e983b8864f32c9fd1545b563398e4a7810"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 18 16:10:44 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:44:08 2013 -0800"
      },
      "message": "Intern strings returned by Gson when parsing build files.\n\nSummary: This prevents `buck targets` from OOM\u0027ing on large projects.\n\nTest Plan:\nVerify that `buck targets` no longer fails, without resorting\nto increasing the max heap size.\n"
    },
    {
      "commit": "80dda7e983b8864f32c9fd1545b563398e4a7810",
      "tree": "53ec6bcaa7eec991f998642892e1def942b9aae7",
      "parents": [
        "870cf5518766e74071dc3d05fa0344e0bd420db3"
      ],
      "author": {
        "name": "Michael Marucheck",
        "email": "mmarucheck@fb.com",
        "time": "Mon Nov 18 12:11:12 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:43:56 2013 -0800"
      },
      "message": "Fix MULTIANEWARRAY instruction w.r.t. dx.\n\nSummary:\nDX converts the MULTIANEWARRAY instruction into a call to the\nArray.newInstance(Class,int...) method.  Since DalvikStatsTool is\ntracking the method counts, it needs to add this method to the mix\nwhen it notices a MULTIANEWARRAY instruction to keep the method counts\ncorrect.\n\nTest Plan: added unit test\n"
    },
    {
      "commit": "870cf5518766e74071dc3d05fa0344e0bd420db3",
      "tree": "58aaa874afa8928dffdc2be96586fb3f7bc16df5",
      "parents": [
        "8c2ee748a8ec5b011b1e465c062bc05e708e281b"
      ],
      "author": {
        "name": "Pieter Hooimeijer",
        "email": "pieter@fb.com",
        "time": "Mon Nov 18 11:46:01 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:43:39 2013 -0800"
      },
      "message": "Add support for --json for `audit classpath`.\n\nSummary:\nReturn the classpath for multiple targets, grouped by\ntarget; sort stuff to make sure the output is stable.\n\nNote: this doesn\u0027t throw if one of the targets\nprovided does not have a classpath; it\u0027s omitted from the output\ninstead.\n"
    },
    {
      "commit": "8c2ee748a8ec5b011b1e465c062bc05e708e281b",
      "tree": "a7d8aa36d91b106aa03e9198e4cca42f3d134880",
      "parents": [
        "6abbc9002d32a288487eb03da70a2026349f4c45"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sun Nov 17 18:22:03 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:43:30 2013 -0800"
      },
      "message": "Fully-qualify Javadoc reference so IDE does not try to add import statement.\n\nSummary:\nIf an IDE, such as Eclipse, adds an import for `ProjectCommand` in `Parser.java`, then\nit will break the build because `Parser` does not depend on the `com.facebook.buck.cli`\npackage.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "6abbc9002d32a288487eb03da70a2026349f4c45",
      "tree": "9233ebd8bbc0e6ce328a787bc3b79fb1ef96fc9a",
      "parents": [
        "8e8613952feeff8833ce96dbb9b5e9affacb35f8"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sun Nov 17 11:17:31 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:43:25 2013 -0800"
      },
      "message": "Update bin/buck.cmd which has fallen behind bin/buck_common.\n\nTest Plan: Ran Buck on Windows 7.\n"
    },
    {
      "commit": "8e8613952feeff8833ce96dbb9b5e9affacb35f8",
      "tree": "a621340e836506e656acfa77c982c8e6d823bcd6",
      "parents": [
        "37d82dce06e40d9985b8ad3663fceeb968e342db"
      ],
      "author": {
        "name": "Jim Purbrick",
        "email": "jimp@fb.com",
        "time": "Mon Nov 18 06:21:21 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:43:10 2013 -0800"
      },
      "message": "Fix python configuration processing.\n\nSummary:\nPreviously buck would try to use any executable file or\ndirectory in its working directory as a python interpreter. It would\nalso silently fall back to finding a python on the PATH if a python\npath was specified in the config, but invalid. This change fixes both\nof those problems and adds tests.\n\nTest Plan:\n0) buck test --all\n1) mkdir python\n2) touch BUCK\n3) check that \"buck build :lolwut\" returns the error \"BUILD FAILED: No rule\nfound when resolving target //:lolwut in build file //BUCK\"\n"
    },
    {
      "commit": "37d82dce06e40d9985b8ad3663fceeb968e342db",
      "tree": "419db8900a5ab6aeefc593926f7d26b660ca4e4c",
      "parents": [
        "f149c8828fb0882817c1173de201b1a7fba49e1e"
      ],
      "author": {
        "name": "Helios Alonso",
        "email": "heliosalonso@fb.com",
        "time": "Wed Nov 13 13:02:07 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 19 18:42:56 2013 -0800"
      },
      "message": "Add webp to filtered drawable resources.\n\nSummary:\nThis way webp in drawable per-dpi directories will be filtered too\n(and we will be able to use webp for newer phones).\n"
    },
    {
      "commit": "f149c8828fb0882817c1173de201b1a7fba49e1e",
      "tree": "4a413cfeee19d9f7f956b4c5d0f9962f3486ea86",
      "parents": [
        "f535dfef50f43f2854feaa6dfd9745abd9bbd692"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:32:45 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:43:37 2013 -0800"
      },
      "message": "Update IDE configurations in response to reflect recent args4j update.\n\nSummary:\n\nTest Plan:\nLoaded project in Eclipse: it works fine.\n"
    },
    {
      "commit": "f535dfef50f43f2854feaa6dfd9745abd9bbd692",
      "tree": "b9cfa4f897c1a170d2e9b670ea091d4169dd6215",
      "parents": [
        "5734955e58cbc9f34d70cdafbfc383da15e6981e"
      ],
      "author": {
        "name": "Michael Marucheck",
        "email": "mmarucheck@fb.com",
        "time": "Fri Nov 15 13:22:07 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:36:48 2013 -0800"
      },
      "message": "Allow project-specific java parameters.\n\nSummary:\nWe need to increase the heap size for Buck.  This lets projects add\njava runtime flags.\n\nTest Plan: unit tests; run a command that OOMs, add .buckjavaargs, verify success\n"
    },
    {
      "commit": "5734955e58cbc9f34d70cdafbfc383da15e6981e",
      "tree": "62d9bcc063add816e524f8212cd141aafadb42db",
      "parents": [
        "6ef0080a4508f45c09238499d7c7ef1b38df146d"
      ],
      "author": {
        "name": "khadkevich",
        "email": "khadkevich@fb.com",
        "time": "Fri Nov 15 05:21:57 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:36:28 2013 -0800"
      },
      "message": "Updated args4j lib to 2.0.26 version.\n\nSummary:\nUpdated to the latest args4j version.\nNow arguments in format -argname\u003dargvalue are supported.\n"
    },
    {
      "commit": "6ef0080a4508f45c09238499d7c7ef1b38df146d",
      "tree": "c433edf200cfe82be564f7b72165364dbe83e222",
      "parents": [
        "2bb4b5f443501f903792e68a155cc433f009d27f"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Nov 14 09:26:05 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:36:22 2013 -0800"
      },
      "message": "Rearrange steps in AndroidBinary.getBuildSteps() so aapt_package steps come first.\n\nSummary: This sets us up to do the aapt_package stuff in a separate build rule.\n\nTest Plan:\nSandcastle builds.\nBuild all the things and make sure the APKs still come out right.\n"
    },
    {
      "commit": "2bb4b5f443501f903792e68a155cc433f009d27f",
      "tree": "b885a88fe7274e0f4fa1b42c4ba23035dc9ffa34",
      "parents": [
        "1b333dc85f8cf336c322eaf2ce9de6f148049fc6"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 13 20:15:23 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:36:21 2013 -0800"
      },
      "message": "Replace `createMock(OnDiskBuildInfo.class)` with `new FakeOnDiskBuildInfo()`.\n\nSummary: As promised, I am trying to address my abuse of mocks by replacing them with fakes.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "1b333dc85f8cf336c322eaf2ce9de6f148049fc6",
      "tree": "12665fccbd9b840a80dffcae4f9f4b61ac11826e",
      "parents": [
        "6a2848b55939d01ef84b9ddf7639eb223a99f081"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 13 19:52:11 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:36:20 2013 -0800"
      },
      "message": "Replace `createMock(Buildable.class)` with `new FakeBuildable()`.\n\nSummary: As promised, I am trying to address my abuse of mocks by replacing them with fakes.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "6a2848b55939d01ef84b9ddf7639eb223a99f081",
      "tree": "383e461fa1c8b40f1088f43a77fce83b33139799",
      "parents": [
        "0d615a7bd1470ada388a19271911af5a702949b1"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 13 19:30:24 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:36:18 2013 -0800"
      },
      "message": "Replace `createMock(JavaLibraryRule.class)` with `new FakeJavaLibraryRule()`.\n\nSummary: As promised, I am trying to address my abuse of mocks by replacing them with fakes.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "0d615a7bd1470ada388a19271911af5a702949b1",
      "tree": "730485e4f9368903896b65a5e35b94c9dec0f0c6",
      "parents": [
        "a81c7fe668412b56495fea23ba12f8fc3a81ff32"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 13 18:33:24 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:36:16 2013 -0800"
      },
      "message": "Replace `createMock(BuildableContext.class)` with `new FakeBuildableContext()`.\n\nSummary: As promised, I am trying to address my abuse of mocks by replacing them with fakes.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "a81c7fe668412b56495fea23ba12f8fc3a81ff32",
      "tree": "14e1f67339777934bf3c9237586324db6c82102b",
      "parents": [
        "3599d0b0ba4ae23f2d2c1378f72c829c7e63c81f"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Nov 14 17:59:30 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:36:05 2013 -0800"
      },
      "message": "Use Java 7 APIs to unzip a file instead of shelling out to `unzip`.\n\nSummary:\nUsers have been reporting intermittent errors when multiple threads\nare unzipping artifacts pulled from cache. Previously, we were\nshelling out to `unzip` to do this extraction, but now, we use Java 7\nAPIs that create the parent directories for each file before\nwriting the file. We\u0027ll have to live with this in the wild and see\nwhether this is an improvement.\n\nIf nothing else, this makes this part of the code work on Windows\ninstead of only Linux and OS X.\n\nNote that this diff also removes the `filesToExtract` option from `UnzipStep`,\nas no one was using it and it was not tested.\n\nTest Plan:\nI did a build purely from cache with 12 threads and did not get\nany collisions.\n"
    },
    {
      "commit": "3599d0b0ba4ae23f2d2c1378f72c829c7e63c81f",
      "tree": "853659d447c6cc05bbdba9ec557b5c442afdf362",
      "parents": [
        "a92d87a8d342aa0e623fc02ba2cc7b44e2df2963"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Wed Nov 13 19:14:47 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:35:58 2013 -0800"
      },
      "message": "Fix WARN_ON_TRANSITIVE.\n\nSummary:\nThe WARN_ON_TRANSITIVE flag seems to have been broken for a while.\n\nFix it and add tests.\n\nTest Plan: tests\n"
    },
    {
      "commit": "a92d87a8d342aa0e623fc02ba2cc7b44e2df2963",
      "tree": "d21b73735979705e7e32afc626b15a8bc8cc29a1",
      "parents": [
        "f59d2635c5815903405131969e61ccfc86349fd6"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Wed Nov 13 18:45:18 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:35:50 2013 -0800"
      },
      "message": "Add ability to specify target for project.\n\nSummary: First bit of slices.\n"
    },
    {
      "commit": "f59d2635c5815903405131969e61ccfc86349fd6",
      "tree": "236789700199aa1712a79e5e2c13f6fbc5314668",
      "parents": [
        "5b890d1a4c13cc7144fbfdd2a0b525c1627db4ec"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 12:43:57 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:35:34 2013 -0800"
      },
      "message": "Convert DexProducedFromJavaLibraryThatContainsClassFiles into an AbstractCachingBuildRule that is an AbiRule.\n\nSummary:\nThere are three possible scenarios when building `DexProducedFromJavaLibraryThatContainsClassFiles`:\n\n(1) The are are no `.class` files to dex.\n(2) There are `.class` files that need to be dexed to update/create the `.dex.jar` file in `buck-out`.\n(3) The existing `.dex.jar` file in `buck-out` already represents the `.class` files to dex.\n\nIn order to be able to look at what is in `buck-out` before building (case 3), we either\nneed to get a rule key match (which works by default in Buck), or leverage the `AbiRule`\nlogic we already have in place for Java rules. (If we wait until we start building\n`DexProducedFromJavaLibraryThatContainsClassFiles`, the `buck-out` directory containing\nthe old `.dex.jar` may already be deleted.)\n\nRecall that an `AbiRule` can avoid rebuilding if the following conditions hold:\n(1) The hash of the current rule definition and its input files matches the\nhash on disk (written in `.metadata/METADATA_KEY_FOR_RULE_KEY_WITHOUT_DEPS`).\n(2) All relevant deps that have an ABI have the same ABI as the last time the\nrule was built (written in `.metadata/ABI_KEY_FOR_DEPS_ON_DISK_METADATA`).\n\nTherefore, for an `AccumulateClassNames`, we assign it an ABI based on the\ncontents of the `classes.txt` file that it writes.\nBecause a `DexProducedFromJavaLibraryThatContainsClassFiles` has a\n`AccumulateClassNames` as its only dependency, the ABI of `AccumulateClassNames`\nis the ABI-key-for-deps of the `DexProducedFromJavaLibraryThatContainsClassFiles`.\n\nUltimately, this ensures that if a `java_library` rule is recompiled such that its\ngenerated `.class` files are the same (this happens when a `java_library` rule is\nrecompiled in response to one of its deps changing in a way that does not affect\nthat `java_library` that depends on it, such as adding a new public method),\nthen the output of the `classes.txt` file for the `java_library` should be the same.\nIn turn, because the ABI of the `AccumulateClassNames` that generated the\n`classes.txt` is unchanged, the `DexProducedFromJavaLibraryThatContainsClassFiles`\nshould rightfully avoid a rebuild. This optimization can have a significant impact on\nincremental build times.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "5b890d1a4c13cc7144fbfdd2a0b525c1627db4ec",
      "tree": "332ab501963b60322ba9beff26accbdf3f653c12",
      "parents": [
        "799aa5d47e63cc08be41839822868909f84f3ba6"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 12:14:30 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:35:29 2013 -0800"
      },
      "message": "Use AccumulateClassNames.getClassNames() to determine whether to run dx.\n\nSummary:\nPreviously, `DexProducedFromJavaLibraryThatContainsClassFiles` would store a\ntiny bit of metadata to determine whether its dependent `AccumulateClassNames`\nfound any class files. Now we just ask the `AccumulateClassNames` directly.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "799aa5d47e63cc08be41839822868909f84f3ba6",
      "tree": "4d42eada7eda35c86033bdd130b8d704f1e9ce24",
      "parents": [
        "cd359ffbb84e252f493f70020f9d0bdfd1ea0bbb"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 11:44:01 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:35:22 2013 -0800"
      },
      "message": "AccumulateClassNames makes the discovered class names and their hashes available.\n\nSummary:\nIn turn, this makes the class names and hashes available to\n`DexProducedFromJavaLibraryThatContainsClassFiles`, which is important for:\n(1) Avoiding a re-dex when the .class files have not changed.\n(2) Making it possible for split-dex to determine which intermediate .dex\nfiles need to be in the primary classes.dex.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "cd359ffbb84e252f493f70020f9d0bdfd1ea0bbb",
      "tree": "4cbf3e553bf2b4d9d85c8212697e91053a33836d",
      "parents": [
        "2281adbfacc2a447d2480107ad9632a86c48eba9"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 09:08:41 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:35:14 2013 -0800"
      },
      "message": "AccumulateClassNamesStep now includes the hashes of the .class files in classes.txt.\n\nSummary:\nThis is the first step in making it so that\n`DexProducedFromJavaLibraryThatContainsClassFiles` does not re-dex if the `.class`\nfiles from its dependent `JavaLibraryRule` are unchanged.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "2281adbfacc2a447d2480107ad9632a86c48eba9",
      "tree": "7362226bf87d58beaadd2716b3d24ccd5fbf021b",
      "parents": [
        "1dfbda5de17953c30aede593a0156458fe5d4f08"
      ],
      "author": {
        "name": "Jim Purbrick",
        "email": "jimp@fb.com",
        "time": "Wed Nov 13 08:55:50 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:35:09 2013 -0800"
      },
      "message": "Print client disconnection.\n\nSummary:\nPrint error message on client disconnection. In the normal\ncase this will never be seen as the client has disconnected, but this\nchange should help detect suspected false disconnections.\n\nTest Plan: buck test --all\n"
    },
    {
      "commit": "1dfbda5de17953c30aede593a0156458fe5d4f08",
      "tree": "5e740b5474d47cdccdb0d7c34ae52ad4fe58a7a7",
      "parents": [
        "fe49da41fcf43b873e9c91d27fe11607819d82a0"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 13 08:47:56 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 16 19:34:53 2013 -0800"
      },
      "message": "Print out the stack trace when we get an InterruptedException in buckd.\n"
    },
    {
      "commit": "fe49da41fcf43b873e9c91d27fe11607819d82a0",
      "tree": "56986ebd5e14b94fce61f7fe26b00696d4a2f05d",
      "parents": [
        "dc66f90b8ec05447026a8e6acca5e76373eb19d1"
      ],
      "author": {
        "name": "Daniel Marinescu",
        "email": "danielm@fb.com",
        "time": "Tue Nov 12 14:26:44 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:58:37 2013 -0800"
      },
      "message": "Include the transitive deps when computing the ABI key of a dep with export_deps\u003dTrue.\n\nSummary: When computing the ABI key of a dependency with export_deps\u003dTrue,\nthe ABI keys for the transitive dependencies will be hashed in the final ABI key.\n\nTest Plan: Added new test: DefaultJavaLibraryRuleTest.testGetAbiKeyInThePresenceOfExportDeps().\n"
    },
    {
      "commit": "dc66f90b8ec05447026a8e6acca5e76373eb19d1",
      "tree": "dcdfea44443ff8678dda481f495ab68e22dd7a08",
      "parents": [
        "e29e40560fc8deece12801ce65e5a3a4537dc878"
      ],
      "author": {
        "name": "Michael Marucheck",
        "email": "mmarucheck@fb.com",
        "time": "Tue Nov 12 12:55:32 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:54:31 2013 -0800"
      },
      "message": "Temporarily reduce method count limit for dexing.\n\nSummary:\nWe have seen issues where Buck is not counting a reference to a\nmethod when tracking how full a .jar is.  While debugging this\nissue, this change temporarily reduces the limit so the resulting\n.jar will have slightly fewer methods so dx can handle it.\n"
    },
    {
      "commit": "e29e40560fc8deece12801ce65e5a3a4537dc878",
      "tree": "d11a586f1378a89343e6f99ee70f2f1a068ae04c",
      "parents": [
        "c3d0c6e752ad0d57a082d3b3d345fa599f9cbb3e"
      ],
      "author": {
        "name": "Jim Purbrick",
        "email": "jimp@fb.com",
        "time": "Tue Nov 12 10:43:19 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:54:28 2013 -0800"
      },
      "message": "Name all the threads.\nInitialize build log FileHandler once per process.\n"
    },
    {
      "commit": "c3d0c6e752ad0d57a082d3b3d345fa599f9cbb3e",
      "tree": "65b5eb98141a5b62647499501765a5824677c823",
      "parents": [
        "1e3afaa3f61b91be5cfdaaca0aaa5f345117daaf"
      ],
      "author": {
        "name": "Ron Edelstein",
        "email": "rone@fb.com",
        "time": "Mon Nov 11 15:33:43 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:54:25 2013 -0800"
      },
      "message": "Use symlinks when creating PythonLibrary environment.\n\nSummary: Use symbolic links instead of copying. The links needed to be\nrelative in order to allow the keep cached data correct across repositories.\n"
    },
    {
      "commit": "1e3afaa3f61b91be5cfdaaca0aaa5f345117daaf",
      "tree": "3402f08dfe9c9eef23574b8cd7cba94319b2ef2e",
      "parents": [
        "b3111ef070c45b7515536a36703b4510b78b462b"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Nov 07 18:12:25 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:54:21 2013 -0800"
      },
      "message": "Fix AndroidBinaryRule.Builder so that build() can be invoked multiple times.\n\nSummary:\nA previous diff introduced a change to `AndroidBinaryRule.Builder` such that invoking\n`build()` would leave around some state (only if pre-dexing was applied) that\nwould cause a problem if `build()` were invoked again on the same `Builder` object.\n\nWhen `buckd` is not running, `build()` is only invoked once, so this went\nundetected in the original diff.\n"
    },
    {
      "commit": "b3111ef070c45b7515536a36703b4510b78b462b",
      "tree": "70a127bb3c1781a623bbcddf96424ee9b68c2576",
      "parents": [
        "eab2c70a699b6c3b65ba0031c4e61cf540f4a85d"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 11 14:21:01 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:54:08 2013 -0800"
      },
      "message": "Add an option to DxStep to specify a custom dx executable.\n\nSummary:\nUse the custom dx option when running the \"dx merge\" step in AndroidBinaryRule.\n\nThis also fixes a copy/paste error in DxStep\u0027s Javadoc.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "eab2c70a699b6c3b65ba0031c4e61cf540f4a85d",
      "tree": "4e03ed89e36d187659266532770b46932be7f1fd",
      "parents": [
        "9adf8cac1012946b2e1e6a75c8d63c4d3faa537a"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Nov 07 14:09:39 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:54:06 2013 -0800"
      },
      "message": "Updated `buck query` to accept aliases.\n"
    },
    {
      "commit": "9adf8cac1012946b2e1e6a75c8d63c4d3faa537a",
      "tree": "c16cd6855591655c715d170a3d5222dd79a4cc67",
      "parents": [
        "d37f7c6699fb0f76aae8468548bca5d1688e2fa7"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Nov 07 13:54:48 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:54:01 2013 -0800"
      },
      "message": "Refactor CommandLineBuildTargetNormalizer to use pass-from-above.\n\nSummary:\n`CommandLineBuildTargetNormalizer` is constructed lazily by and made available through\n`AbstractCommandOptions`.\n\nThis diff also deletes `BuildTargetNormalizer`, which apparently was unused.\n\nThis reduces the number of `Function` objects that need to be created.\nThis will make it simpler to add a normalize() method that takes a\nsingle string, which will be done in a follow-up diff that uses it.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "d37f7c6699fb0f76aae8468548bca5d1688e2fa7",
      "tree": "29cc82d4c276a2436fe66d0422bf256170272f70",
      "parents": [
        "c6a3f9c5b611488c2891ff3f4cd0489660417b20"
      ],
      "author": {
        "name": "David Reiss",
        "email": "mbolin@fb.com",
        "time": "Sun Nov 10 22:03:51 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:58 2013 -0800"
      },
      "message": "Temporary fix for debugshrink builds.\n"
    },
    {
      "commit": "c6a3f9c5b611488c2891ff3f4cd0489660417b20",
      "tree": "452d98d2a3491b27707145cf2a3be947f6e3eb5f",
      "parents": [
        "947c6b32677861a7f7a84b96218c086199cede57"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sun Nov 10 18:02:07 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:56 2013 -0800"
      },
      "message": "Update AndroidManifest to accept a SourcePath for a skeleton argument.\n"
    },
    {
      "commit": "947c6b32677861a7f7a84b96218c086199cede57",
      "tree": "6251d7a5d5970009f1bc69a98e9987d49e382fc9",
      "parents": [
        "971bc5bcf705c4a870d1b496aeb02f479f70098c"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Fri Nov 08 23:05:28 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:49 2013 -0800"
      },
      "message": "Modify BuildFileToJsonParser to use Gson\u0027s streaming parser.\n\nSummary:\nInstead of using our hand-tuned streaming parser, use the default one in Gson.\nThis also enables us to parse arbitrary JSON structures instead of only arrays\nof arrays of primitives.\n\nThis changes `BuildFileToJsonParser` to take `isServerMode` as a constructor param\nso that we are explicit. Despite what the comment on `BuildFileToJsonParser#isServerMode`\nsays, I don\u0027t believe that we can use \"regular mode\" going forward.\nThat is, because the output from `buck.py` includes an `__includes` entry,\nwe cannot read a single JSON object in isolation because there may be context\nfrom the `__includes` entry that it needs.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "971bc5bcf705c4a870d1b496aeb02f479f70098c",
      "tree": "ffa855062e85b88521d57fdc8ec18a01d1cf2afe",
      "parents": [
        "3c2d42fdd4ba7020d340120e6f74f59e0ee826ae"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Fri Nov 08 22:09:54 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:43 2013 -0800"
      },
      "message": "Make Gson available to Buck.\n\nSummary: This is the first step in using Gson instead of Jackson.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "3c2d42fdd4ba7020d340120e6f74f59e0ee826ae",
      "tree": "f3a7476c6d667630054164c24062f4d81e1da842",
      "parents": [
        "9f3133a9ac46e0161a04c7510784a2cdb4fe4c7a"
      ],
      "author": {
        "name": "Michael Marucheck",
        "email": "mmarucheck@fb.com",
        "time": "Fri Nov 08 15:39:50 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:39 2013 -0800"
      },
      "message": "Pull out common constant in `DxStepTest`.\n"
    },
    {
      "commit": "9f3133a9ac46e0161a04c7510784a2cdb4fe4c7a",
      "tree": "277400a1273a04ff00fa3e5a7336159e9a3f841c",
      "parents": [
        "7ad3bdd890c65b348a5d58a948c7d91c9260b21f"
      ],
      "author": {
        "name": "David Reiss",
        "email": "dreiss@fb.com",
        "time": "Fri Nov 08 11:29:24 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:33 2013 -0800"
      },
      "message": "Make SplitZipStep use proguard mapping on builds with obfuscation.\n\nSummary:\nPreviously, we had some hacks in place to make zip splitting work\nproperly on builds with obfuscated class names, but they weren\u0027t\nscalable.  Now the split-zip step pulls in the proguard class name\nmapping and uses that to apply primary dex policies more accurately.\n"
    },
    {
      "commit": "7ad3bdd890c65b348a5d58a948c7d91c9260b21f",
      "tree": "a537cb24304eaf4434d82116f57b6f2c428a3bc7",
      "parents": [
        "07f57a56282591a3e5c1b6ad019183f4b54bcb2a"
      ],
      "author": {
        "name": "David Reiss",
        "email": "dreiss@fb.com",
        "time": "Fri Nov 08 11:33:43 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:24 2013 -0800"
      },
      "message": "Clarify a variable name in SplitZipStep.\n\nSummary:\nI\u0027m going to be adding some complexity to this variable, so give it a\nmore specific name.\n\nTest Plan: Unit.\n"
    },
    {
      "commit": "07f57a56282591a3e5c1b6ad019183f4b54bcb2a",
      "tree": "f24f01408df91fee7487cacd6a596e271b1ea467",
      "parents": [
        "aecf30529199ae9a8d9977c92054bfe4e8cd6a4f"
      ],
      "author": {
        "name": "David Reiss",
        "email": "dreiss@fb.com",
        "time": "Fri Nov 08 11:30:47 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:21 2013 -0800"
      },
      "message": "Factor out a helper in SplitZipStep.\n\nSummary:\nI\u0027m going to be adding some complexity to\ncreateRequiredInPrimaryZipPredicate, so pull part of it out as a helper\nfunction to make some room.\n\nTest Plan: Unit.\n"
    },
    {
      "commit": "aecf30529199ae9a8d9977c92054bfe4e8cd6a4f",
      "tree": "c0735cec6be7a2822c1df13b9b75783570626312",
      "parents": [
        "d62c824611d08444432a79e0cb43ceb3772f008b"
      ],
      "author": {
        "name": "Natthu Bharambe",
        "email": "natthu@fb.com",
        "time": "Fri Oct 18 11:36:25 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:16 2013 -0800"
      },
      "message": "Custom file format for string files.\n\nSummary:\nWe were using JSON as the file format for strings dumped as assets. The\nresulting `APK` for fb4a is around 400-500 KB bigger in size, which is not\nacceptable. This introduces a custom format (explained in javadocs).\n\nIn order to further trim the file size, we store resource ids instead of\nresource names. In order to achieve this, the strings file generation step is\nnow delayed, running it after the final `R.java` file is created by `aapt`.\nInstead of parsing `R.java`, I also make `aapt` generate `R.txt` which is very\neasy to parse.\n"
    },
    {
      "commit": "d62c824611d08444432a79e0cb43ceb3772f008b",
      "tree": "6f7d1c47d154aedf3eea4623c6e6bd9e553f4d58",
      "parents": [
        "9d9d2f720300371427b22bf66cbdd94c8ca234ef"
      ],
      "author": {
        "name": "Michael Marucheck",
        "email": "mmarucheck@fb.com",
        "time": "Fri Nov 08 08:01:16 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:13 2013 -0800"
      },
      "message": "Use java_binary output rather than libs for $(exe).\n\nSummary:\nCurrently when using $(exe) to reference a java binary in a genrule,\nwe build the java binary jar and then ignore it.  Instead, we pass a\nclasspath that loads executable code from the java binary\u0027s transitive\ndependencies.\n"
    },
    {
      "commit": "9d9d2f720300371427b22bf66cbdd94c8ca234ef",
      "tree": "a434449ee67304e5d5b0b7e42f34edbaecd42e82",
      "parents": [
        "7410e8092ff09a8880c26b35afdab3b68ff97467"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Nov 07 16:37:41 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:02 2013 -0800"
      },
      "message": "Provide disable_pre_dex option for android_binary().\n\nSummary:\nThis gives us an escape hatch to disable pre-dexing on an individual\nandroid_binary() rule. The plan is to improve pre-dexing so that it\nis clearly a win so we can ultimately remove this option.\n"
    },
    {
      "commit": "7410e8092ff09a8880c26b35afdab3b68ff97467",
      "tree": "541f08659b0c7446bd2d4a27a540359ac609ad7c",
      "parents": [
        "3ee7979e21cba0006520881c74788c9be93dbd8c"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Nov 07 15:13:08 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:53:01 2013 -0800"
      },
      "message": "Introduce the use of graph enhancement to enable pre-dexing.\n\nTest Plan:\nSandcastle builds.\n"
    },
    {
      "commit": "3ee7979e21cba0006520881c74788c9be93dbd8c",
      "tree": "e133a88e4c8c16d95bcac5df4df48bd1e8973a47",
      "parents": [
        "59759043f66de17140b423a7f11a2d8827b4cbbf"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 06 18:07:34 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:55 2013 -0800"
      },
      "message": "Introduce DexJavaLibraryIfItContainsClassFiles Buildable.\n\nSummary:\n`DexJavaLibraryIfItContainsClassFiles` is a `Buildable` that takes the output of a `JavaLibraryRule` and\nand dexes it, assuming the output of the `JavaLibraryRule` contains `.class` files.\nIt relies on an `AccumulateClassNames` to determine whether there are `.class` files to dex.\n\nOnce `DexJavaLibraryIfItContainsClassFiles` has the path to the classes file,\nit uses a `FileExistsAndIsNotEmptyStep` combined with a `ConditionalStep` to\nmake sure that the list of `.class` files is non-empty before running the `DxStep`\nbecause `dx` will fail if it is run on input that does not contain any `.class` files.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "59759043f66de17140b423a7f11a2d8827b4cbbf",
      "tree": "c0ecd9e0c9f92e4ed37ffbe0be239b1284ac25f2",
      "parents": [
        "305154c1f97374c2b4bb9ea45a9921d0a1c8c525"
      ],
      "author": {
        "name": "Rob Arnold",
        "email": "robarnold@fb.com",
        "time": "Thu Nov 07 10:45:37 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:51 2013 -0800"
      },
      "message": "python_library should not flatten libraries.\n\nSummary:\nMulti-file python libraries are often contained in a directory and\nimported by that directory\u0027s name. Flattening the hierarchy will render that\nmodule unimportable (or worse, possibly import only part of it). By copying the\nunflattened subtree, we preserve the semantics of Python\u0027s module system while\nretaining the isolation property.\n"
    },
    {
      "commit": "305154c1f97374c2b4bb9ea45a9921d0a1c8c525",
      "tree": "f6496d5210afb6cc326cece279ff2e1192ea7ee8",
      "parents": [
        "72a0b98fac998894845488a3be989f8f9da9c0e3"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Nov 07 10:19:26 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:48 2013 -0800"
      },
      "message": "Include the RuleKey on both BuildRuleEvent.Started and BuildRuleEvent.Finished.\n\nSummary: This should make it considerably easier to debug caching issues.\n\nTest Plan:\nSandcastle builds.\nInspect build.trace after doing a build and verify that RuleKeys are present.\n"
    },
    {
      "commit": "72a0b98fac998894845488a3be989f8f9da9c0e3",
      "tree": "b7f2bb24121342b769fd4c604faeea9163eb6171",
      "parents": [
        "5f1189894b87fd7e494fd04a835c22d77f1e0a1e"
      ],
      "author": {
        "name": "Yiding Jia",
        "email": "yiding@fb.com",
        "time": "Wed Nov 06 17:29:08 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:39 2013 -0800"
      },
      "message": "buck.py more permissive symlinking.\n\nSummary:\nf0dedaec09331f73b3970658344cf8f3cb37a83b introduced a symlink aware walk aimed\nat preventing recursively symlink loops; however, it was too restrictive in\nthat it pruned all symlinks that it has visited before, not only those that\nwould result in recursive symlinks. This breaks legitimate uses of symlinking\nto siblings and cousin directories.\n\nThis diff adds a second test before pruning the symlink: not only must the\ntarget directory be one already visited, but it must also be a direct ancestor\nof the current directory.\n\nTest Plan:\nTrigger the traversal code by using recursive `glob` and `buck test --all` on\ndirectories with the following configurations:\n\nTest that siblings are okay (`b` and `c` are both traversed):\n\n  a/\n    b/\n    c -\u003e b\n\nTest that ancestors are still rejected (`c` is not traversed):\n\n  a/\n    b/\n      c/ -\u003e ../b\n"
    },
    {
      "commit": "5f1189894b87fd7e494fd04a835c22d77f1e0a1e",
      "tree": "3aef4dd8360801b5ca0ce628617f02d5a309ce0d",
      "parents": [
        "218db80712ec603c302ccb8ba837779b351b5149"
      ],
      "author": {
        "name": "Jack O\u0027Connor",
        "email": "jacko@fb.com",
        "time": "Wed Nov 06 17:39:50 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:33 2013 -0800"
      },
      "message": "Add a BUCK_COLOR env var, fixing SuperConsole in buckd.\n\nSummary:\nbuckd can\u0027t tell whether the caller is talking to a tty or not, so we need to\ntell it in order to enable SuperConsole output. Add BUCK_COLOR, which\n(extending the existing color config) takes values of true/always, false/never,\nor auto. Copy the VerbosityParser hack to get this option early in startup.\nModify the buck starter script to pass this value to the nailgun server.\n\nThoughts on renaming the \"color\" config to \"fancy\" or something?\n\nTest Plan: buckd output is now Super by default. Confirm that \"never\" overrides the default.\n"
    },
    {
      "commit": "218db80712ec603c302ccb8ba837779b351b5149",
      "tree": "280209d46b22f715407b6ff1869425c297bbcfcb",
      "parents": [
        "7e669a654e2fb4461e84de14d493ac221e1d739e"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 06 16:46:25 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:31 2013 -0800"
      },
      "message": "Introduce ConditionalStep.\n\nSummary: This is needed for the upcoming predex work.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "7e669a654e2fb4461e84de14d493ac221e1d739e",
      "tree": "b613c73b0c42aa5df54d1b9387c64a10e340997b",
      "parents": [
        "f003dca9b922cb7b010e7070b0a5254d4e531b64"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 06 14:19:11 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:29 2013 -0800"
      },
      "message": "Replace some casts from BuildRule to Buildable with rule.getBuildable().\n\nSummary:\nI think that we needed these casts at one time, but now they are no\nlonger appropriate. Especially since more of our implementations of\n`BuildRule` do not actually implement `Buildable`.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "f003dca9b922cb7b010e7070b0a5254d4e531b64",
      "tree": "8329b73e3cf90ffa4ce879c1da06df59a9b0c788",
      "parents": [
        "4893aecf3b2d9e7cc8d7ca59fe79d96fc1fcb509"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 06 10:23:08 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:27 2013 -0800"
      },
      "message": "Introduce AccumulateClassNames rule to produce the list of .class files in a Java artifact.\n\nSummary: This is needed for the upcoming pre-dexing diff.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "4893aecf3b2d9e7cc8d7ca59fe79d96fc1fcb509",
      "tree": "83109a75c8671cc5f10cfd4af5378a9777834432",
      "parents": [
        "f04d6debd7353ded20d0ea7cf259aaf397b16124"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Nov 06 10:18:39 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:26 2013 -0800"
      },
      "message": "Add \u003c?\u003e to silence raw type warning in Eclipse.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "f04d6debd7353ded20d0ea7cf259aaf397b16124",
      "tree": "933ca1bd3331f9b8b7d20af4478db122835d3cf9",
      "parents": [
        "2ac7fcbcf0a1acb7ed6f9671bb1f7499c7398aa3"
      ],
      "author": {
        "name": "Simon Stewart",
        "email": "simons@fb.com",
        "time": "Wed Nov 06 09:05:27 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:22 2013 -0800"
      },
      "message": "Add a class that can generate a subset of buck.py and populate constructor args reflectively.\n\nSummary:\nAs part of the work to add a plugin mechanism, we need a way of allowing new extensions to declare\nwhat arguments and dependencies they have without needing to modify buck.py. The\n BuildableArgInspector provides that.\n\nTest Plan: buck test --all\n"
    },
    {
      "commit": "2ac7fcbcf0a1acb7ed6f9671bb1f7499c7398aa3",
      "tree": "dc8dd6480d1151fe4dcca225efb6a84a57c6b285",
      "parents": [
        "05be031196c566cf23f890b5dae1e0a2282c0f2a"
      ],
      "author": {
        "name": "Natthu Bharambe",
        "email": "natthu@fb.com",
        "time": "Fri Oct 18 04:27:11 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:18 2013 -0800"
      },
      "message": "Encapsulate posting to BuckEventBus in ExecutionContext...\n\nSummary:\n...where it makes sense. There\u0027s still a bunch of direct calls to\n`BuckEventBus.post`, but only where `ExecutionContext` is not available.\nPerhaps, I can send out a similar diff for `BuildContext`.\n\nTest Plan: ant test\n"
    },
    {
      "commit": "05be031196c566cf23f890b5dae1e0a2282c0f2a",
      "tree": "3c288e76742cd21ac3d6cb696822970db1b3626e",
      "parents": [
        "c16960e71e5d539d9105be8a0fe1905634dff8b8"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 17:45:11 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Nov 12 17:52:15 2013 -0800"
      },
      "message": "Introduce optional flavor projection to BuildTarget.\n\nSummary:\nFor now, this will be reserved for synthetic build rules that\nare inserted via graph-enhancement.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "c16960e71e5d539d9105be8a0fe1905634dff8b8",
      "tree": "858f781436ed341ea3906158d02a5d3ad7ffaf56",
      "parents": [
        "d25ac1d471aa3b490312c01589b82a02ed2e54a1"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 02 09:45:59 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:41:48 2013 -0800"
      },
      "message": "Support alternative executable for running `dx`.\n\nSummary:\nYou can use `$BUCK_EXTRA_JAVA_ARGS` to specify a `-Dbuck.dx` VM arg\nto `java` when running Buck to specify a path to a custom `dx` executable.\n"
    },
    {
      "commit": "d25ac1d471aa3b490312c01589b82a02ed2e54a1",
      "tree": "a45217f51abc27e8e936313c945ed26fd5a285a1",
      "parents": [
        "dfe23d9d6c5d9e17be95628b6ad12f5a490f0249"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:02:33 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:18:28 2013 -0800"
      },
      "message": "Add support for --force-jumbo in DxStep.\n\nSummary: We need this for the upcoming predex diff.\n\nTest Plan: Comprehensive unit test for DxStep: DxStepTest.\n"
    },
    {
      "commit": "dfe23d9d6c5d9e17be95628b6ad12f5a490f0249",
      "tree": "e3f84a36be8e29d57ebc9a4d2dcfc6ade1ec97d2",
      "parents": [
        "843f71792cb5820ca9fc98e0054ce018d5752be9"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sun Nov 03 15:39:33 2013 -0800"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:18:09 2013 -0800"
      },
      "message": "Fix a cache corruption bug caused by including a rule\u0027s output on its classpath.\n\nSummary:\nApparently, a `java_library` was including its output JAR on the classpath when\nbuilding itself. This means that removing `srcs` from a `java_library` and then rebuilding\nthe rule would still succeed if the output JAR was still around from the previous build.\nThis would explain some rebuild issues that we have received anecdotal reports of,\nbut have not been able to reproduce.\n\nThis diff solves the bug by fixing `DefaultJavaLibraryRule.getDeclaredClasspathEntries()`\nso that its return value matches that which is required by its Javadoc:\n\n```\n/**\n * @return The set of entries to pass to {@code javac}\u0027s {@code -classpath} flag in order to\n *     compile the {@code srcs} associated with this rule.  This set only contains the classpath\n *     entries for those rules that are declared as direct dependencies of this rule.\n */\npublic ImmutableSetMultimap\u003cJavaLibraryRule, String\u003e getDeclaredClasspathEntries();\n```\n\nTest Plan:\nAdded an integration test to make sure changing the set of files in a java_library\u0027s srcs\ncauses a rebuild.\nAdded a unit test to make sure the `-classpath` argument passed to `javac` does not include\nthe output JAR of the `java_library` rule being built.\n"
    },
    {
      "commit": "843f71792cb5820ca9fc98e0054ce018d5752be9",
      "tree": "8d92047d997adffedcd185d1ba51a9054083014d",
      "parents": [
        "bdd4a6303e384b372cce60b0f6ba5df0b8cb4b9e"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Fri Nov 01 20:06:29 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:18:07 2013 -0800"
      },
      "message": "Add getFileSize() and writeLinesToPath() to ProjectFilesystem.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "bdd4a6303e384b372cce60b0f6ba5df0b8cb4b9e",
      "tree": "108229251596f9e8865826a4fd0e4c049d8c5e4e",
      "parents": [
        "47cf9e33eca4cd6eed343780d81128ccec8b292e"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Sat Nov 02 13:01:02 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:18:01 2013 -0800"
      },
      "message": "When running javac, print out the number of errors and warnings.\n\nSummary:\nWhen trying to fix a java_library with a lot of errors, it is helpful\nto see the error count as you go along so you can tell if you are making\nprogress or not.\n\nTest Plan: Built a failing java_library and verify that the message appears.\n"
    },
    {
      "commit": "47cf9e33eca4cd6eed343780d81128ccec8b292e",
      "tree": "43416f2e7e8e3d6672783b42341bdd310690faab",
      "parents": [
        "93ee1abda9e54c2f2527ec99cb7e9fb4fb5f1a22"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Fri Nov 01 12:19:44 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:17:36 2013 -0800"
      },
      "message": "Integration test to verify all tests are run on the same thread under @RunWith.\n\nSummary:\nUpdated `DelegateRunnerWithTimeout` so that it maintains the default behavior of\nJUnit where all tests are run on the same thread. We observed some test cases in\nthe wild that relied on this behavior. Specifically, Robolectric tests rely on this\ndue to a check in `org.robolectric.shadows.ShadowLooper`.\n\nTest Plan:\nAdd a test to the `RunWithDefaultTimeoutIntegrationTest` test case to exercise the fix.\nMade `executor` an instance rather than a `DelegateRunnerWithTimeout` field and verified\nthat `RunWithDefaultTimeoutIntegrationTest#testAllTestsForRunWithAreRunOnTheSameThread()`\nfailed.\n"
    },
    {
      "commit": "93ee1abda9e54c2f2527ec99cb7e9fb4fb5f1a22",
      "tree": "b543487293004ed1a9eb4744b91795ca82148d02",
      "parents": [
        "3f8a3703395a751be25942801d802e033bc14ffe"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Fri Nov 01 12:16:08 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:17:31 2013 -0800"
      },
      "message": "In BuildRuleResolver, assert that a rule is added only once.\n\nSummary: This seems to have uncovered a bug in AndroidBinaryRuleTest.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "3f8a3703395a751be25942801d802e033bc14ffe",
      "tree": "3652eea6fbbeb598bf89863ad276fa2e51446d4a",
      "parents": [
        "7f6331b6c7ef0142d457ed6c1b3fac7c4ac6dfad"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Thu Oct 31 09:33:03 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:17:26 2013 -0800"
      },
      "message": "Specify --no-optimize to dx for APK debug builds.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "7f6331b6c7ef0142d457ed6c1b3fac7c4ac6dfad",
      "tree": "a2cfd237d8549bb4071ed04e2de754bc1292e1bd",
      "parents": [
        "20c376bd44571e148e3b41103e19bff390834566"
      ],
      "author": {
        "name": "Christian Legnitto",
        "email": "christianl@fb.com",
        "time": "Wed Oct 30 22:20:05 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:17:04 2013 -0800"
      },
      "message": "Add TravisCI support.\n\nSummary:\nAdd TravisCI support.\n\nThis makes it so test status shows up in the README.md and on pull requests.\n\nWe use TravisCI for xctool as well.\n"
    },
    {
      "commit": "20c376bd44571e148e3b41103e19bff390834566",
      "tree": "4b550751452218a278b8ff57e4e7235bc80886ce",
      "parents": [
        "0b0a71cdf3986048a8df487f6ff27066ab7a6555"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Wed Oct 30 19:51:36 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Mon Nov 04 11:16:57 2013 -0800"
      },
      "message": "Added \u0027Performance Tuning Your Builds\u0027 article to documentation.\n\nSummary: Document performance tuning\n\nTest Plan: Ran soy locally.\n"
    },
    {
      "commit": "0b0a71cdf3986048a8df487f6ff27066ab7a6555",
      "tree": "b3012fd52ed6289e34ce7269e07bbed80f75709c",
      "parents": [
        "859f47600d0787bf250c69c847fc1d805f74ac9a"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 16:38:41 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 16:46:53 2013 -0700"
      },
      "message": "Reuse the ExecutorService in DelegateRunnerWithTimeout so all tests are run on the same thread.\n\nSummary:\nIt appears that all tests that use `ShadowLooper` in Robolectric need to be started from\nthe same thread so that its `resetThreadLoopers()` method works as expected.\n\nTest Plan:\nSandcastle builds.\nI promise to write an integration test in a follow-up diff.\n"
    },
    {
      "commit": "859f47600d0787bf250c69c847fc1d805f74ac9a",
      "tree": "7c5701f3befddcf54ffb62d4815bcf80f073b80a",
      "parents": [
        "9a7040e27378077dc0874ad5b067298b5f25eaf9"
      ],
      "author": {
        "name": "Jim Purbrick",
        "email": "jimp@fb.com",
        "time": "Wed Oct 30 16:05:46 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 16:45:34 2013 -0700"
      },
      "message": "Normalize All The Path Cache Keys\n\nSummary:\nEquivalent paths do not always hash equally. When used as\nhash table keys, Paths need to be normalized and either absolute or\nrelative to the same directory. This change normalizes the Paths used\nas hash keys in the DefaultFileHashCache to ensure the cache works as\nintended.\n\nTest Plan:\n0) buckd\n1) buck test --all\n2) add a failing assertion to a test\n3) buck test --all\n4) ensure that step 3 fails\n"
    },
    {
      "commit": "9a7040e27378077dc0874ad5b067298b5f25eaf9",
      "tree": "5c820604a9a73a1acb3a620ac9b14c6d7b0ee0e3",
      "parents": [
        "94cc16f9e45d66f6a17a091cddeec03c2765162b"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 14:07:06 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 14:11:20 2013 -0700"
      },
      "message": "Ensure that the default timeout in .buckconfig works with @RunWith.\n\nSummary:\nThe custom logic that we use to support a default timeout for tests in `.buckconfig`\nrelies on our ability to use a `BuckBlockJUnit4ClassRunner` in place of a\n`BlockJUnit4ClassRunner` when running JUnit. Unfortunately, when `@RunWith`\nis present, the code path to produce a `BlockJUnit4ClassRunner` is not exercised,\nwhich means our `BuckBlockJUnit4ClassRunner` is not inserted, which means\nthat our default timeout is not enforced.\n\nThis diff modifies the `AllDefaultPossibilitiesBuilder` that is used to select the factory\nthat is used to produce a `Runner` (which may or may not be a `BlockJUnit4ClassRunner`).\nWhen `@RunWith` is present, we now take the `Runner` that is produced as a result of the\n`@RunWith` annotation and wrap it with a `DelegateRunnerWithTimeout` that enforces our\ndefault timeout.\n\nIt does this by taking the `RunNotifier` passed by the client and wrapping it in a\n`DelegateRunNotifier`, which is passed to the original `Runner`. Our `DelegateRunNotifier`\nintercepts events from the original `Runner` and passes them on based on the state of\ntest execution relative to the default timeout from `.buckconfig`.\n\nUnfortunately, the logic in our `DelegateRunnerWithTimeout`/`DelegateRunNotifier` is not\nas airtight as the logic in our `BuckBlockJUnit4ClassRunner`, so we are not going to delete\nour `BuckBlockJUnit4ClassRunner` codepath just yet.\n\nTest Plan: RunWithDefaultTimeoutIntegrationTest.\n"
    },
    {
      "commit": "94cc16f9e45d66f6a17a091cddeec03c2765162b",
      "tree": "28be7c6f902ab0ad275d135c2b9bc351f32c2934",
      "parents": [
        "54e2446e0f9fa0abb3e45d923e5b93f0ec507894"
      ],
      "author": {
        "name": "Jim Purbrick",
        "email": "jimp@fb.com",
        "time": "Wed Oct 30 13:50:32 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 14:11:15 2013 -0700"
      },
      "message": "Don\u0027t print empty lines to SimpleConsole.\n\nSummary:\nIf an empty builder is passed to\nSimpleConsoleEventBusListener.printLines return rather than printing\nan empty line to the console.\n\nTest Plan:\n0) buck test --all\n1) buckd\n2) buck build buck\n3) check that no empty lines are printed by 2\n"
    },
    {
      "commit": "54e2446e0f9fa0abb3e45d923e5b93f0ec507894",
      "tree": "f3920ee819a25d187064cdc73a09a5d9b4fe5abe",
      "parents": [
        "246665878b3578a306471eef2a94b6909141485a"
      ],
      "author": {
        "name": "Jim Purbrick",
        "email": "jimp@fb.com",
        "time": "Wed Oct 30 13:48:46 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 14:11:02 2013 -0700"
      },
      "message": "Update buckd consoles.\n\nSummary:\nParsers and FileHashCaches are reused by multiple commands,\nso need to have their consoles updated on each command so that they\ncan log to the current console.\n\nTest Plan:\n0) buck test --all\n1) buckd\n2) buck build -v 8 buck \u0026\u003e /dev/null\n3) touch tmp\n4) buck build -v 8 buck 2\u003e\u00261 | head\n5) check that 4 prints \"Parser watched event ENTRY_MODIFY ... tmp\"\n"
    },
    {
      "commit": "246665878b3578a306471eef2a94b6909141485a",
      "tree": "82f0cd7bde750cd2865552f89277e0cc60d19b43",
      "parents": [
        "faf3655e5395f5f1630b8b724855bb81ede1b0e1"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:19:13 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:53:06 2013 -0700"
      },
      "message": "Spruce up the documentation for Buck.\n\nSummary:\n* Update the home page to note that Buck is both an Android and a Java build tool.\n* Document the `buck quickstart` and `buck query` commands.\n* Rewrite the Quick Start page to use `buck quickstart`.\n* Migrate the old Quick Start page to the \"Manual Quick Start\" page.\n* Create some new macros for inserting hyperlinks in `__common.soy`.\n* Wrote up an article titled \"What Makes Buck so Fast?\"\n\nTest Plan: Inspected locally on http://localhost:9811/.\n"
    },
    {
      "commit": "faf3655e5395f5f1630b8b724855bb81ede1b0e1",
      "tree": "046a91d9aaa568d6cb6d716628bf9be3deb1b562",
      "parents": [
        "c22c43da2a7fe0a0e62090d2c1d6a67b9a715a8c"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 12:26:41 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:52:58 2013 -0700"
      },
      "message": "Clean up `ant javadoc` to exclude tests and quickstart sample files.\n\nTest Plan:\nRan `ant clean javadoc` and verified that there were no warnings or errors.\nThen viewed `build/javadoc/index.html` in Google Chrome and verified it looks good.\n"
    },
    {
      "commit": "c22c43da2a7fe0a0e62090d2c1d6a67b9a715a8c",
      "tree": "0b014ba9f98992d9579aabdb490963e57efb1ba5",
      "parents": [
        "a43cecc1e205555938ba82c64d30c9bb13ef747d"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 12:23:08 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:52:47 2013 -0700"
      },
      "message": "Replace InputRule with Path.\n\nSummary:\nUpdated `ConcurrentMapFileHashCache` to use a `LoadingCache` to maintain the\nmapping from `Path` to `HashCode`.\n\nPreviously, `InputRule` contained four fields (`File`, `BuildTarget`, `ListenableFuture`, `RuleKey`).\nWe had one of these for potentially every file in a project. That is a large potential for\nwasted memory. The existence of `InputRule` also required us to persist some kludginess in\n`BuildTarget`.\n\nThis diff removes the hacks from `BuildTarget` and reclaims potentially a ton of memory.\nBy using a `LoadingCache`, we do not have to worry about the same input file being sha1\u0027d\nmultiple times. We can also stop passing around references to a pathResolver in many places\nand rely on `Path` being a path relative to the project root.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "a43cecc1e205555938ba82c64d30c9bb13ef747d",
      "tree": "eaad9ebec6175fece1b836ff71ace7403b09905f",
      "parents": [
        "4c6b95050cc65268993e33cbb65d3fb5ef5f9370"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Wed Oct 30 10:51:20 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:52:34 2013 -0700"
      },
      "message": "Don\u0027t offer to clean the repo if there are modified files; don\u0027t offer to clean if there is no .buckversion.\n"
    },
    {
      "commit": "4c6b95050cc65268993e33cbb65d3fb5ef5f9370",
      "tree": "14cd1af46d172b32fb7cfbb11104e2a16193327b",
      "parents": [
        "0e7631aa705f5a4a80520e6a78ed010410a535ff"
      ],
      "author": {
        "name": "Jim Purbrick",
        "email": "jimp@fb.com",
        "time": "Wed Oct 30 08:47:02 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:51:16 2013 -0700"
      },
      "message": "Update NailGun.\n\nSummary:\nUpdate the version of NailGun that buckd uses to\nhttps://github.com/martylamb/nailgun/commits/fcc24ecd63ead63f160e96f6a0640f6b4280f72d,\nwhich uses a FixedThreadPool instead of CachedThreadPool to reduce the number of threads\nthat Buck uses and notifies blocked threads on client disconnection so that threads aren\u0027t leaked.\n\nTest Plan:\n0) buck test --all\n1) buckd\n2) buck build buck\n3) buck build buck\n4) check that buckd is using \u003c70 threads\n"
    },
    {
      "commit": "0e7631aa705f5a4a80520e6a78ed010410a535ff",
      "tree": "b0ba7283014a80c979652dc58d64a3361e85aebc",
      "parents": [
        "b7327a3cc8379c32f889ce06dcc62bf18e559b96"
      ],
      "author": {
        "name": "David Reiss",
        "email": "dreiss@fb.com",
        "time": "Tue Oct 29 12:46:53 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:51:10 2013 -0700"
      },
      "message": "Use Uninterruptibles in MoreFutures.isSuccess.\n\nSummary:\nSame behavior, but it\u0027s less code because Guava already handles the\ninterrupted state.\n\nTest Plan: Unit.\n"
    },
    {
      "commit": "b7327a3cc8379c32f889ce06dcc62bf18e559b96",
      "tree": "5d1401156f8eeddaa6cc3915f7ae5015bab478be",
      "parents": [
        "52251a25b13c96a870a2e864a0dfa242a649231f"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Tue Oct 29 08:24:34 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:50:59 2013 -0700"
      },
      "message": "Make com.facebook.buck.util.concurrent.MoreExecutors available to our JUnitRunner.\n\nSummary:\nBuckBlockJUnit4ClassRunner contains some copy/paste code from MoreExecutors because\nour JUnit runner uses a restricted classpath. This diff refactors things to share\nthe MoreExecutors code with our JUnitRunner.\n\nAlso remove duplicate documentation in BuckBlockJUnit4ClassRunner.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "52251a25b13c96a870a2e864a0dfa242a649231f",
      "tree": "358738319e291ef9f37dfa051297f1c2a1944ddd",
      "parents": [
        "545cf9f20a2d8d9c5e1bdb50277bfa63ac5e608c"
      ],
      "author": {
        "name": "Eugene Susla",
        "email": "eugenesusla@fb.com",
        "time": "Mon Oct 28 15:49:35 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:50:53 2013 -0700"
      },
      "message": "Removed Paths.normalizePathSeparator and Paths.containsBackslash.\n\nSummary:\nThis removes two methods from com.facebook.buck.util.Paths class, replacing\ntheir usages with methods form MorePaths\n\nTest Plan: ant clean test\n"
    },
    {
      "commit": "545cf9f20a2d8d9c5e1bdb50277bfa63ac5e608c",
      "tree": "9c41e1f619ebf58dd526a3d1338b5e5c903e0ec4",
      "parents": [
        "c6173a21426755a8591d40b283ef8ccd8f9daf44"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Mon Oct 28 13:44:29 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:50:42 2013 -0700"
      },
      "message": "Fix a bug with PythonBinary where I returned the wrong subset of deps.\n\nTest Plan:\nUnit tests\n"
    },
    {
      "commit": "c6173a21426755a8591d40b283ef8ccd8f9daf44",
      "tree": "82d45014df438bc2b04a71e46b328151e2ad8a84",
      "parents": [
        "48d933fd937c84e52e9883ac63b0f53c80298f17"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Mon Oct 28 12:40:45 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:50:30 2013 -0700"
      },
      "message": "Prompt user to clean their buck directory.\n\nTest Plan:\nBuck build with garbage in my buckdir, verify I was prompted, verify if I cleaned\nmy dir cache hits worked, if I didn\u0027t there were no cache hits.\n"
    },
    {
      "commit": "48d933fd937c84e52e9883ac63b0f53c80298f17",
      "tree": "42b6c3d268177de1e819157dda72d56279c33e9c",
      "parents": [
        "6ab2841f7b3e3dfeabe3b00d58ef88df4b7d2fd4"
      ],
      "author": {
        "name": "Roy Williams",
        "email": "royw@fb.com",
        "time": "Fri Oct 25 15:18:09 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:50:27 2013 -0700"
      },
      "message": "Simplify switch statement in Project.java.\n\nTest Plan: Unit tests\n"
    },
    {
      "commit": "6ab2841f7b3e3dfeabe3b00d58ef88df4b7d2fd4",
      "tree": "7ac4db2e6e4b057095b586b7c53c729ef1c72059",
      "parents": [
        "119ad8bfc097866c55dc79c7e6bdfadbe5c259a8"
      ],
      "author": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Fri Oct 25 14:56:09 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:50:19 2013 -0700"
      },
      "message": "Create recursive symlink rather than storing it in version control.\n\nSummary:\nThe presence of this recursive symlink was causing `ant lint` to yield\na warning, which is distracting.\n\nTest Plan: Sandcastle builds.\n"
    },
    {
      "commit": "119ad8bfc097866c55dc79c7e6bdfadbe5c259a8",
      "tree": "9e09f8bdc098e477a560286d4f9152e287cd535d",
      "parents": [
        "f0dedaec09331f73b3970658344cf8f3cb37a83b"
      ],
      "author": {
        "name": "Eugene Susla",
        "email": "eugenesusla@fb.com",
        "time": "Fri Oct 25 11:43:15 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:50:14 2013 -0700"
      },
      "message": "Moved Paths.transformFileToAbsolutePath to MorePaths.\n\nSummary: No point in using java.nio.text.Paths in this one, so just moving it to the new utility class.\n\nTest Plan: ant clean test\n"
    },
    {
      "commit": "f0dedaec09331f73b3970658344cf8f3cb37a83b",
      "tree": "6a2770c0772298c1815ebf88d0839b1981831f60",
      "parents": [
        "77c0edda5c29fa4d464d28bb5efd7e905c41de79"
      ],
      "author": {
        "name": "Yiding Jia",
        "email": "yiding@fb.com",
        "time": "Wed Oct 23 18:19:52 2013 -0700"
      },
      "committer": {
        "name": "Michael Bolin",
        "email": "mbolin@fb.com",
        "time": "Wed Oct 30 13:49:59 2013 -0700"
      },
      "message": "Deal with recursive symlinks in directory traversal in buck.py.\n\nSummary:\nRecently this file was changed to do a recursive traversal while following\nsymlinks, without dealing with recursive symlinks.\n\nThis diff deals with recursive symlinks by recording all visited paths, and\nskipping the ones that have already been visited.\n"
    }
  ],
  "next": "77c0edda5c29fa4d464d28bb5efd7e905c41de79"
}
