)]}'
{
  "log": [
    {
      "commit": "15371ad6522eaa0a35340c6acec3c2b6dc311281",
      "tree": "d62f7dab3e664992ba82c7767b4a148661c4cf09",
      "parents": [
        "f9dbc3becc0fcdcb49bb6e6992a023fa4de7de80",
        "ba5bf880bfe6b911da57997f9ebc3a46d69980ca"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Fri Jul 15 17:54:25 2016 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 15 17:54:25 2016 -0700"
      },
      "message": "Merge pull request #106 from colincross/type_error\n\nFix error messages containing variable types"
    },
    {
      "commit": "ba5bf880bfe6b911da57997f9ebc3a46d69980ca",
      "tree": "d62f7dab3e664992ba82c7767b4a148661c4cf09",
      "parents": [
        "f9dbc3becc0fcdcb49bb6e6992a023fa4de7de80"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Jul 15 16:40:37 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Jul 15 16:43:42 2016 -0700"
      },
      "message": "Fix error messages containing variable types\n\nvalue.Type and value.Pos changed to methods, change the users that were\nnot caught by error checking to use Type() or Pos().\n\nChange-Id: I295a658c007fa2de68c89fb85ee367fbea5ed1aa\n"
    },
    {
      "commit": "f9dbc3becc0fcdcb49bb6e6992a023fa4de7de80",
      "tree": "61106cc45e8120190ce9574c71ad434b7d2e7bc1",
      "parents": [
        "2e32b2facce418cb32f6bba757b306d38cf44de3",
        "6b6735d3be43a1647d5f6d4883dda3c3cbaad28d"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Jul 13 10:40:15 2016 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 13 10:40:15 2016 -0700"
      },
      "message": "Merge pull request #105 from colincross/printer_panic\n\nprinter: support multiple skipped comments"
    },
    {
      "commit": "6b6735d3be43a1647d5f6d4883dda3c3cbaad28d",
      "tree": "61106cc45e8120190ce9574c71ad434b7d2e7bc1",
      "parents": [
        "2e32b2facce418cb32f6bba757b306d38cf44de3"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jul 12 16:03:08 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jul 12 16:12:09 2016 -0700"
      },
      "message": "printer: support multiple skipped comments\n\nThere may be multiple skipped comments in a row, convert\np.skippedComments to a list and add a test.\n\nChange-Id: I30dcff269bee56fd51ef9513dab7c7885c44b7d7\n"
    },
    {
      "commit": "2e32b2facce418cb32f6bba757b306d38cf44de3",
      "tree": "c4f413b92dc3d6cf6c57798d63d5a8f053808e6c",
      "parents": [
        "d4f49b07d1b4b80da2e1234b2e9a37eb6a50ba55",
        "1e73794d421a8017dbbc1d80913d93571d46d1b6"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Jun 14 19:07:27 2016 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 14 19:07:27 2016 -0700"
      },
      "message": "Merge pull request #104 from colincross/parser\n\nMore parser cleanups"
    },
    {
      "commit": "1e73794d421a8017dbbc1d80913d93571d46d1b6",
      "tree": "c4f413b92dc3d6cf6c57798d63d5a8f053808e6c",
      "parents": [
        "1ead6452b5dbaebed7e815f77feb26f3abaf2a02"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Jun 10 17:27:12 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jun 14 15:26:49 2016 -0700"
      },
      "message": "Add CommentGroups\n\nDetermining which comments are contiguous is difficult once they have\nbeen parsed into an out-of-band comment list, as any intervening nodes\nare in a separate structure.  Group the comments into CommentGroups\nduring the parsing stage instead.\n\nChange-Id: I9444c58e75333b7521b58dbfbd36ff29d139b6e3\n"
    },
    {
      "commit": "1ead6452b5dbaebed7e815f77feb26f3abaf2a02",
      "tree": "1be1440b51700d45c9dbdf88ad5dc56426b6adf2",
      "parents": [
        "b3d0b8dab43776e5391eeebe8a9a0de7600ba219"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jun 09 17:40:13 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jun 14 15:26:49 2016 -0700"
      },
      "message": "Make everything a Node\n\nMake File, Assignment, and Module implement Node.  Nodes will be used\nlater for traversing a File.\n\nChange-Id: I938a5d39d48aee7fe174180b12a2870ecf756b34\n"
    },
    {
      "commit": "b3d0b8dab43776e5391eeebe8a9a0de7600ba219",
      "tree": "eb312534bcea19f05d0da2e8fa12b4f9f8e1605a",
      "parents": [
        "c32c47938f2a04cd62aed8691add85049c6a6625"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jun 09 17:03:57 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jun 14 15:26:49 2016 -0700"
      },
      "message": "Rename Pos members\n\nPos is going to be part of the Node interface, rename the Pos member\nof structs to be more specific.\n\nChange-Id: Ibd31119863b96d38bf8dac216e026200a54bbe18\n"
    },
    {
      "commit": "c32c47938f2a04cd62aed8691add85049c6a6625",
      "tree": "6cbea64054721bde94235e88f70800f6183be25a",
      "parents": [
        "d4f49b07d1b4b80da2e1234b2e9a37eb6a50ba55"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jun 09 15:52:30 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jun 14 15:26:49 2016 -0700"
      },
      "message": "Remove blueprint/parser.Ident\n\nIt wasn\u0027t adding anything useful, and it resulted in Name.Name to get to\nthe identifier.  Replace Name Ident with Name string; NamePos\nscanner.Position.\n\nChange-Id: Idf9b18b31dd563a18f27c602c2d14298955af371\n"
    },
    {
      "commit": "d4f49b07d1b4b80da2e1234b2e9a37eb6a50ba55",
      "tree": "16b68a65b75fa320a3fb539d92705c94b22a34dc",
      "parents": [
        "aedd4903a9ddded8113c704e350436a977df651c",
        "e32cc80f200c09f3547a45f2535fb0cfd9ea4464"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu Jun 09 11:02:39 2016 -0700"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu Jun 09 11:02:39 2016 -0700"
      },
      "message": "Merge pull request #103 from colincross/parser\n\nRefactor blueprint parser nodes to an interface"
    },
    {
      "commit": "e32cc80f200c09f3547a45f2535fb0cfd9ea4464",
      "tree": "16b68a65b75fa320a3fb539d92705c94b22a34dc",
      "parents": [
        "aedd4903a9ddded8113c704e350436a977df651c"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jun 07 12:28:16 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Jun 08 14:48:53 2016 -0700"
      },
      "message": "Refactor blueprint parser nodes to an interface\n\nRefactor the blueprint parser Value object, which contained a Type enum\nand members to hold every possible type, into an interface (now called\nExpression).  Rename the existing Expression object that represented a binary\noperator Operator.\n\nAlso adds and fixes some new printer test cases with mulitline expressions.\n\nChange-Id: Icf4a20f92c8c2a27f18df8ca515a9d7f282ff133\n"
    },
    {
      "commit": "aedd4903a9ddded8113c704e350436a977df651c",
      "tree": "12b4b1fe6c871ee42dec2dccfa4c5d6f6c154ce7",
      "parents": [
        "92077ac02429e7849d8623b9b7e938653e3a6449",
        "79324963f279f15fee76d4173a6fa82693871bb3"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu Jun 02 15:39:50 2016 -0700"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu Jun 02 15:39:50 2016 -0700"
      },
      "message": "Merge pull request #101 from colincross/doc\n\nbpdoc improvements"
    },
    {
      "commit": "79324963f279f15fee76d4173a6fa82693871bb3",
      "tree": "12b4b1fe6c871ee42dec2dccfa4c5d6f6c154ce7",
      "parents": [
        "d9f6fd55dd7a586b42eaab3b7f094954a28b9176"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Jun 01 21:44:44 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jun 02 12:38:24 2016 -0700"
      },
      "message": "Fix documentation property type for pointers\n\nChange-Id: I7964215adb5e04f5e7a50370e3d98b51ee100ee5\n"
    },
    {
      "commit": "d9f6fd55dd7a586b42eaab3b7f094954a28b9176",
      "tree": "32060a4fb17273988b15bff2ebc31c1698afa798",
      "parents": [
        "017ed2e27b5ea906571d064177822da8b37b7284"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue May 31 16:16:00 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jun 02 12:38:24 2016 -0700"
      },
      "message": "Remove naming stutter in bpdoc\n\nThe word \"doc\" spread all over bpdoc is redundant and makes it harder to\ndifferentiate the various types and variables.  Everything in bpdoc is a\ndoc, so remove it.  Also rename Collector to Context.\n\nChange-Id: Ia616d789ee27e7c94d9be231bdb248d45b2b7f39\n"
    },
    {
      "commit": "017ed2e27b5ea906571d064177822da8b37b7284",
      "tree": "c6d6032886196ce65bbfd9630512c066cf072385",
      "parents": [
        "92077ac02429e7849d8623b9b7e938653e3a6449"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue May 31 15:53:32 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jun 02 12:38:24 2016 -0700"
      },
      "message": "Fix govet issues\n\nChange-Id: I4fb957ed10270ae3c17b458fcc7d7e11cea61417\n"
    },
    {
      "commit": "92077ac02429e7849d8623b9b7e938653e3a6449",
      "tree": "8f1dd178b49fe521bea1ef11c558945b2ffb5040",
      "parents": [
        "0499fc9e1edf001ea8b689f97659e263be60199e",
        "be275236ac6ff9ae4785ba5236d6ead0536c2439"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Thu May 26 12:59:12 2016 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Thu May 26 12:59:12 2016 -0700"
      },
      "message": "Merge pull request #100 from danw/blueprint_tools\n\nAdd blueprint_go_binary for user-run tools"
    },
    {
      "commit": "be275236ac6ff9ae4785ba5236d6ead0536c2439",
      "tree": "8f1dd178b49fe521bea1ef11c558945b2ffb5040",
      "parents": [
        "0499fc9e1edf001ea8b689f97659e263be60199e"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu May 26 10:07:59 2016 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu May 26 10:09:35 2016 -0700"
      },
      "message": "Add blueprint_go_binary for user-run tools\n\nMove these tools from $buildDir/.bootstrap/bin to $buildDir/bin\n(configurable by the primary builder).\n\nAlso delay building them until the main stage, and give them a phony\ntarget \"blueprint_tools\".\n"
    },
    {
      "commit": "0499fc9e1edf001ea8b689f97659e263be60199e",
      "tree": "16a1d7752756b107c6bd7e3da6d6769c536f74ce",
      "parents": [
        "bfeb5df158e87f64d36b658d1c05a5452eadcfd9",
        "75c4701ed279254350a86f1e9bfb9a22b173a283"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu May 05 23:36:26 2016 +0000"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu May 05 23:36:26 2016 +0000"
      },
      "message": "Merge pull request #99 from colincross/static\n\nSupport ExtendProperties that can append or prepend"
    },
    {
      "commit": "75c4701ed279254350a86f1e9bfb9a22b173a283",
      "tree": "16a1d7752756b107c6bd7e3da6d6769c536f74ce",
      "parents": [
        "bfeb5df158e87f64d36b658d1c05a5452eadcfd9"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu May 05 15:58:02 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu May 05 16:23:19 2016 -0700"
      },
      "message": "Support ExtendProperties that can append or prepend\n\nExtendProperties is the same as AppendProperties or PrependProperties,\nbut takes a function that determines whether each property should be\nappended or prepended.\n\nChange-Id: I26e400d56d75a88bab9c27c382ee5321bc623ee5\n"
    },
    {
      "commit": "bfeb5df158e87f64d36b658d1c05a5452eadcfd9",
      "tree": "dfb7898284331aa19041560b39cda75b334fa8b5",
      "parents": [
        "97f6b9b61d01c9feca29ac4cf61624372aab5c98",
        "f1875466fc0f5dda2a5da38f872c74101a29176e"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Apr 12 15:19:55 2016 -0700"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Apr 12 15:19:55 2016 -0700"
      },
      "message": "Merge pull request #98 from colincross/deptag\n\nAdd dependency tags, clone all modules after mutators, support AddInterVariantDependency"
    },
    {
      "commit": "f1875466fc0f5dda2a5da38f872c74101a29176e",
      "tree": "dfb7898284331aa19041560b39cda75b334fa8b5",
      "parents": [
        "2c1f3d1b28329a553700c0934348a2a1d7f0ac63"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Apr 11 17:33:13 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 12 14:52:46 2016 -0700"
      },
      "message": "Support dependencies between variants\n\nVariants of a module may need to depend on other variants, for example\nto reuse results between variants.  Support AddInterVariantDependency to\nadd an explicit dependency from one variant to another, along with a\ndependency tag.  Both modules must have just been returned by a call to\nCreateVariants.\n\nChange-Id: I8f4878f94ced74dd00cfac8303b15ef70cdebf36\n"
    },
    {
      "commit": "2c1f3d1b28329a553700c0934348a2a1d7f0ac63",
      "tree": "a50d94a12f09af179063ad07385b74a3bc1f9dbd",
      "parents": [
        "910242b9a6d512187b22b3a38f71fb7b158e2174"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Apr 11 15:47:28 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 12 14:52:46 2016 -0700"
      },
      "message": "Add support for dependency tags\n\nPrimary builder logic is becoming complicated due to the two pass nature\nof mutators that add dependencies and GenerateBuildActions that handle\nthe dependencies.  The reason why the dependency was added is lost by\nthe time GenerateBuildActions is called, resulting in build logic that\nhas to recreate all the dependencies and try to match them up to the\nmodules returned by VisitDirectDeps.\n\nChange the API of AddDependency to take a DependencyTag interface, which\nis satisifed by anything that embeds BaseDependencyTag.  Mutators and\nGenerateBuildActions that call VisitDirectDeps can pass each Module to\nctx.OtherModuleDependencyTag to retreive the DependencyTag that was\npassed when adding the dependency.\n\nChange-Id: I0814dcd26d1670302d340b77e8dc8704ed7b60bf\n"
    },
    {
      "commit": "910242b9a6d512187b22b3a38f71fb7b158e2174",
      "tree": "6056cd4ffa3a011577a160545ed1c35bda47a100",
      "parents": [
        "97f6b9b61d01c9feca29ac4cf61624372aab5c98"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Apr 11 15:41:52 2016 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 12 14:52:46 2016 -0700"
      },
      "message": "Clone all modules between mutators and GenerateBuildActions\n\nA common pattern in mutators is to set a property on a module to be used\nlater in GenerateBuildActions.  A common anti-pattern is to set a member\nvariable instead of a property.  Setting member variables will appear to\nwork until a mutator calls CreateVariations after the member variable is\nset.  The first variant will have the member variables, but any other\nvariants will have zero values for all member variables.\n\nTo catch this common case early, replace all modules with clones after\nrunning all the mutators but before GenerateBuildActions.\n\nThis catches the anti-pattern used in bootstrap, replace the buildStage\nmember variable with a property.\n\nChange-Id: I6ff37580783a6227ebba2b46d577b443566a79bb\n"
    },
    {
      "commit": "97f6b9b61d01c9feca29ac4cf61624372aab5c98",
      "tree": "c38180b8b81d77b44a37cce16b4f2dd2a89f48da",
      "parents": [
        "eba92c77e03dfb078e7da5f292060655d648281f",
        "4bb62762eb31e1e97f3347ba389f04d394010614"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Tue Mar 29 20:19:48 2016 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Tue Mar 29 20:19:48 2016 -0700"
      },
      "message": "Merge pull request #97 from danw/eval\n\nAdd SingletonContext.Eval to evaluate ninja strings"
    },
    {
      "commit": "4bb62762eb31e1e97f3347ba389f04d394010614",
      "tree": "c38180b8b81d77b44a37cce16b4f2dd2a89f48da",
      "parents": [
        "eba92c77e03dfb078e7da5f292060655d648281f"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Jan 14 15:42:54 2016 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Mar 28 14:14:15 2016 -0700"
      },
      "message": "Add SingletonContext.Eval to evaluate ninja strings\n\nOur use case is to write out some configuration variables to give to our\nlegacy build system. But in order to do that, we either need to keep a\nGo copy of all of the configuration, and still have all the calls to\nconvert them to ninja variables, or evaluate our ninja variables.\n\nChange-Id: If9dda305ed41bc8aabe57dd750a74d8b9af1d1a4\n"
    },
    {
      "commit": "eba92c77e03dfb078e7da5f292060655d648281f",
      "tree": "26ec4748c31a266430987a70345bbc47b726a2c9",
      "parents": [
        "4a9ea518001f02c9cba52a12d1e961807f7f80de",
        "a664b0a7d6b6f6a7aab395b630a643f926e0b82d"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Wed Mar 23 21:34:03 2016 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Wed Mar 23 21:34:03 2016 -0700"
      },
      "message": "Merge pull request #96 from TKilbourn/master\n\nFix package names for executables."
    },
    {
      "commit": "a664b0a7d6b6f6a7aab395b630a643f926e0b82d",
      "tree": "26ec4748c31a266430987a70345bbc47b726a2c9",
      "parents": [
        "4a9ea518001f02c9cba52a12d1e961807f7f80de"
      ],
      "author": {
        "name": "Tim Kilbourn",
        "email": "tkilbourn@gmail.com",
        "time": "Wed Mar 23 20:39:43 2016 -0700"
      },
      "committer": {
        "name": "Tim Kilbourn",
        "email": "tkilbourn@gmail.com",
        "time": "Wed Mar 23 20:57:43 2016 -0700"
      },
      "message": "Fix package names for executables.\n\nGo 1.6 fixed a bug where compiling with the -pack flag allowed non-main\npackages to link.\nhttps://github.com/golang/go/issues/13468\n\nThis change uses package main for choosestage and gotestmain.\n"
    },
    {
      "commit": "4a9ea518001f02c9cba52a12d1e961807f7f80de",
      "tree": "5b74e68a09ed56b0375b825af64bd35b6958c7ec",
      "parents": [
        "24d81001677743c3ebffe32a2a48c7036974d1fb",
        "c02745a845858b8513f92926e9733715c0209ee5"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu Mar 03 15:58:39 2016 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu Mar 03 15:58:39 2016 -0800"
      },
      "message": "Merge pull request #94 from yuchenericwu2/master\n\nwalkDeps: Fixed bug on non-walked, visited deps."
    },
    {
      "commit": "c02745a845858b8513f92926e9733715c0209ee5",
      "tree": "5b74e68a09ed56b0375b825af64bd35b6958c7ec",
      "parents": [
        "9c4e0508527a420e2a957e09c3ce8e898e8d4090"
      ],
      "author": {
        "name": "Yuchen Wu",
        "email": "yuchenericwu@google.com",
        "time": "Wed Mar 02 16:40:39 2016 -0800"
      },
      "committer": {
        "name": "Yuchen Wu",
        "email": "yuchenericwu@google.com",
        "time": "Thu Mar 03 15:53:50 2016 -0800"
      },
      "message": "walkDeps: Fixed bug on non-walked, visited deps.\n\nvisited map was not being updated when the dependency was being\nvisited, only if it was being walked. This led to cases where\nduplicate traversals were possible.\n"
    },
    {
      "commit": "24d81001677743c3ebffe32a2a48c7036974d1fb",
      "tree": "e27b4933194b4872d6825dfa30bdc7f055377574",
      "parents": [
        "fc5bf58609afc15b995c236aab5476f14b7746df",
        "9c4e0508527a420e2a957e09c3ce8e898e8d4090"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Wed Jan 13 15:27:12 2016 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Wed Jan 13 15:27:12 2016 -0800"
      },
      "message": "Merge pull request #93 from danw/docptrs\n\ndocs: Allow propery structs to contain non-struct ptrs"
    },
    {
      "commit": "9c4e0508527a420e2a957e09c3ce8e898e8d4090",
      "tree": "e27b4933194b4872d6825dfa30bdc7f055377574",
      "parents": [
        "fc5bf58609afc15b995c236aab5476f14b7746df"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jan 13 13:56:24 2016 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jan 13 13:58:45 2016 -0800"
      },
      "message": "docs: Allow propery structs to contain non-struct ptrs\n\nOther parts of blueprint have started allowing pointers to strings and\nbooleans. This code silently allowed them because of the nil check, but\nit doesn\u0027t work if the module factory sets a default value.\n"
    },
    {
      "commit": "fc5bf58609afc15b995c236aab5476f14b7746df",
      "tree": "cb45623aebbf2dea0379f4e3091f17943aef6a8c",
      "parents": [
        "2acf987b8b8e6fa10052023d0fccd84925eec334",
        "0aa6a5f0ad42debe76a90173de7d10f1ecda3ba0"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Jan 08 14:23:23 2016 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Jan 08 14:23:23 2016 -0800"
      },
      "message": "Merge pull request #92 from colincross/errors\n\nImprove error handling"
    },
    {
      "commit": "0aa6a5f0ad42debe76a90173de7d10f1ecda3ba0",
      "tree": "cb45623aebbf2dea0379f4e3091f17943aef6a8c",
      "parents": [
        "ea5995439c9a228ec496a5d12901b8b0bc27ccab"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jan 07 13:43:09 2016 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jan 07 17:24:26 2016 -0800"
      },
      "message": "Catch panics in build logic\n\nCatch panics in the build logic in order to provide extra data on when\nthe panic occurred, for example which module had GenerateBuildActions\ncalled on it.\n"
    },
    {
      "commit": "ea5995439c9a228ec496a5d12901b8b0bc27ccab",
      "tree": "ab7baf0acb0e1365d5831445afdb127b6b3b8e4d",
      "parents": [
        "2acf987b8b8e6fa10052023d0fccd84925eec334"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jan 07 11:16:48 2016 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Jan 07 17:24:15 2016 -0800"
      },
      "message": "Colorize errors\n\nPrefix errors with \"error:\" or \"internal error:\" colored in red using\nANSI codes.  Ninja will strip the ANSI codes when build output is not\ngoing to a terminal that can handle ANSI codes.\n"
    },
    {
      "commit": "2acf987b8b8e6fa10052023d0fccd84925eec334",
      "tree": "5d915f3939aca6912172f6960380673ec4d0cd82",
      "parents": [
        "bd93c9a39cec9854aa34979687c5c1a6d127b299",
        "4c00085f2dd3d2cd3cac61bfe9f8e5d84fe27bd0"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Wed Jan 06 10:30:05 2016 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Wed Jan 06 10:30:05 2016 -0800"
      },
      "message": "Merge pull request #91 from danw/replace_strptr\n\nAppendProperties: Replace *strings instead of appending"
    },
    {
      "commit": "4c00085f2dd3d2cd3cac61bfe9f8e5d84fe27bd0",
      "tree": "5d915f3939aca6912172f6960380673ec4d0cd82",
      "parents": [
        "bd93c9a39cec9854aa34979687c5c1a6d127b299"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Jan 05 14:16:04 2016 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Jan 05 14:16:04 2016 -0800"
      },
      "message": "AppendProperties: Replace *strings instead of appending\n\nThis makes *string values act like *bool values -- instead of appending\nor prepending the contents of the string, the entire string is replaced.\nThe use case here is for overriding filenames, where appending doesn\u0027t\nwork.\n"
    },
    {
      "commit": "bd93c9a39cec9854aa34979687c5c1a6d127b299",
      "tree": "41016f4831b7375a1557d4715dd14193ae6ea6c5",
      "parents": [
        "61686a1077f7459640a9ddc36ccf559fa8847afc",
        "a481ae201883172b3ad10cd5bdcdb25ba09bb089"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Mon Dec 21 12:09:33 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Mon Dec 21 12:09:33 2015 -0800"
      },
      "message": "Merge pull request #90 from danw/pctx_addninjafiledeps\n\nAdd AddNinjaFileDeps to PackageContext"
    },
    {
      "commit": "a481ae201883172b3ad10cd5bdcdb25ba09bb089",
      "tree": "41016f4831b7375a1557d4715dd14193ae6ea6c5",
      "parents": [
        "61686a1077f7459640a9ddc36ccf559fa8847afc"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Dec 18 15:18:03 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Dec 18 15:22:26 2015 -0800"
      },
      "message": "Add AddNinjaFileDeps to PackageContext\n\nSoong needs to add dependencies during a VariableFunc. (we\u0027re doing a glob)\n\nChange-Id: Iec7b7082b89e1c7fa43fe7240888d2dabb097a9a\n"
    },
    {
      "commit": "61686a1077f7459640a9ddc36ccf559fa8847afc",
      "tree": "1d3ff6e392c95e4a4c80f6b69fc6f562d54d90fb",
      "parents": [
        "654e20d4c7a49d4cdda5afa9d8c3ea281b33d137",
        "d79f1af7423e0ef7a13573efdae5100a57fabc82"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Fri Dec 18 11:14:47 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Fri Dec 18 11:14:47 2015 -0800"
      },
      "message": "Merge pull request #86 from danw/wrapper\n\nAdd build wrapper to do stage selection before ninja"
    },
    {
      "commit": "654e20d4c7a49d4cdda5afa9d8c3ea281b33d137",
      "tree": "79a5744f28ef213286f7f600523aa7053a70ddcd",
      "parents": [
        "c39cf6b48d3297acfd57f7e85669cced869f1f9e",
        "036a1df37488b1704c59a74260ca3811f7188fd5"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Dec 18 11:07:35 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Dec 18 11:07:35 2015 -0800"
      },
      "message": "Merge pull request #88 from colincross/missing_dependencies\n\nAllow primary builder to handle missing dependencies"
    },
    {
      "commit": "c39cf6b48d3297acfd57f7e85669cced869f1f9e",
      "tree": "055768c353ecb10c5dfe5adf81eb9941232122d1",
      "parents": [
        "1734f30dd2bd7205cbea2d9a6d6ee932125e2790",
        "8c602f7f16ed571918eba4e8e0e0630b3ecd55be"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Dec 18 11:07:32 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Dec 18 11:07:32 2015 -0800"
      },
      "message": "Merge pull request #89 from colincross/context_subdir\n\nAdd ModuleSubDir to Context and SingletonContext"
    },
    {
      "commit": "1734f30dd2bd7205cbea2d9a6d6ee932125e2790",
      "tree": "391b00b81181c2efa254dbe346dc2dbb20432577",
      "parents": [
        "eb97a6e7a1afa6d4817545bec3304e906ecc35f7",
        "7f507406884a05e6fc4b75914ca3de2f1b14baad"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Dec 18 11:07:08 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Dec 18 11:07:08 2015 -0800"
      },
      "message": "Merge pull request #87 from colincross/optionalsubdirs\n\nAdd optional_subdirs variable support"
    },
    {
      "commit": "8c602f7f16ed571918eba4e8e0e0630b3ecd55be",
      "tree": "bf0c3751337c3346056489776428cce5d200f2c2",
      "parents": [
        "eb97a6e7a1afa6d4817545bec3304e906ecc35f7"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Dec 17 18:02:11 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Dec 17 18:02:58 2015 -0800"
      },
      "message": "Add ModuleSubDir to Context and SingletonContext\n\nSingletons may need ModuleSubDir, for example to implement a stable sort\non modules.  Add ModuleSubDir to SingletonContext and Context.\n"
    },
    {
      "commit": "036a1df37488b1704c59a74260ca3811f7188fd5",
      "tree": "959fd176f2068e9ce4f1a91c87aa72846711fade",
      "parents": [
        "eb97a6e7a1afa6d4817545bec3304e906ecc35f7"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Dec 17 15:49:30 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Dec 17 17:26:20 2015 -0800"
      },
      "message": "Allow primary builder to handle missing dependencies\n\nIn some cases the primary builder may need to handle missing\ndependencies.  Add Context.SetAllowMissingDependencies to cause\nBlueprint to store the list of missing dependencies without immediately\nemitting an error, and ModuleContext.GetMissingDependencies to return\nthe missing dependencies to the primary builder.  If the primary builder\ndoes not call ModuleContext.GetMissingDependencies Blueprint will emit\ndependency errors.\n"
    },
    {
      "commit": "7f507406884a05e6fc4b75914ca3de2f1b14baad",
      "tree": "391b00b81181c2efa254dbe346dc2dbb20432577",
      "parents": [
        "eb97a6e7a1afa6d4817545bec3304e906ecc35f7"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Dec 16 13:03:41 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Dec 16 13:03:41 2015 -0800"
      },
      "message": "Add optional_subdirs variable support\n\nWhen building a subset of a source tree, some of the subdirectories\nmentioned in the subdirs variable may be missing.  Add support for an\noptional_subdirs variable, which won\u0027t error out if the requested\ndirectory is missing.\n"
    },
    {
      "commit": "d79f1af7423e0ef7a13573efdae5100a57fabc82",
      "tree": "594f1ce143a57eb31aab0bc96ba83c77097b5a47",
      "parents": [
        "eb97a6e7a1afa6d4817545bec3304e906ecc35f7"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Dec 09 18:03:13 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Dec 10 16:18:15 2015 -0800"
      },
      "message": "Add build wrapper to do stage selection before ninja\n\nThis wrapper script can be used instead of ninja to ensure the build\nwon\u0027t get stuck building the primary builder.\n\nAn example of when this would happen:\n\n1. Do a successful build\n2. Sync/make a change in the primary builder (soong, etc) that depends\n   on a blueprint change.\n3. The next build would notice that change, and rewind to the primary\n   stage to rebuild the builder. That build would fail.\n4. Sync/fix the blueprint code.\n5. The next build would still fail. The bootstrap stage would need to\n   be run in order to fix the primary stage, but we\u0027re still stuck in the\n   primary stage. The only way to switch stages is to successfully\n   complete everything required to choose the next stage.\n\nThis generally isn\u0027t a problem in the main stage, since there is no code\nbeing built in the dependency chain leading up to stage selection.\n\nAny existing wrappers (like soong) can execute this wrapper (optionally\nskipping ninja execution) if they\u0027re worried about the above situation.\nThis isn\u0027t strictly required -- running ninja directly will still work\nin most cases, you\u0027ll just need to re-run bootstrap.bash if you get into\na bad state.\n\nChange-Id: I5901d7240a1daa388a786ceb1c8259502fc14058\n"
    },
    {
      "commit": "eb97a6e7a1afa6d4817545bec3304e906ecc35f7",
      "tree": "2fb64d165aa8cd05e79f88238eddb69dccde25ab",
      "parents": [
        "e8b63ad172f5ce5316cbf0193c9fcaab7575aadf",
        "265d92c7fa10ca0545215f18403bc1c4880334fc"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Thu Dec 10 09:21:26 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Thu Dec 10 09:21:26 2015 -0800"
      },
      "message": "Merge pull request #85 from danw/sctx_failed\n\nAdd SingletonContext.Failed()"
    },
    {
      "commit": "265d92c7fa10ca0545215f18403bc1c4880334fc",
      "tree": "2fb64d165aa8cd05e79f88238eddb69dccde25ab",
      "parents": [
        "e8b63ad172f5ce5316cbf0193c9fcaab7575aadf"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Dec 09 18:06:23 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Dec 09 18:06:23 2015 -0800"
      },
      "message": "Add SingletonContext.Failed()\n\nIdentical to ModuleContext.Failed(), just returns whether there has been\nan error added to the context.\n"
    },
    {
      "commit": "e8b63ad172f5ce5316cbf0193c9fcaab7575aadf",
      "tree": "f66d827ac5177a7b5dabe2d1137581f816a4488d",
      "parents": [
        "6afb72ff1bde8ad53bb0da4b85fa15e73e1bb1fe",
        "aeffbf776abff483634d1fc1bba0abce15b6d72e"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Tue Dec 01 12:53:01 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Tue Dec 01 12:53:01 2015 -0800"
      },
      "message": "Merge pull request #84 from danw/pkgctx\n\nAllow wrapping of PackageContext"
    },
    {
      "commit": "aeffbf776abff483634d1fc1bba0abce15b6d72e",
      "tree": "f66d827ac5177a7b5dabe2d1137581f816a4488d",
      "parents": [
        "6afb72ff1bde8ad53bb0da4b85fa15e73e1bb1fe"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Nov 25 15:29:32 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Nov 30 17:03:34 2015 -0800"
      },
      "message": "Allow wrapping of PackageContext\n\nTurn PackageContext into an interface so that build systems can wrap it\nto add more custom helpers.\n\nThis does introduce an API change, though it should be fairly simple.\nNewPackageContext used to provide an opaque *PackageContext struct, now it\nprovides a PackageContext interface.\n\nChange-Id: I383c64a303d857ef5e0dec86ad77f791ba4c9639\n"
    },
    {
      "commit": "6afb72ff1bde8ad53bb0da4b85fa15e73e1bb1fe",
      "tree": "4ec86c5bdf0e9339547d2ec26985d7def3a201dd",
      "parents": [
        "5c11f817e1c09deaa0fc23b49d8defa679fc2f61",
        "5a9f4d1db25003e0baddcaae462207c50c4d5742"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 24 11:23:39 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 24 11:23:39 2015 -0800"
      },
      "message": "Merge pull request #83 from colincross/embed\n\nSupport embedded anonymous property structs"
    },
    {
      "commit": "5a9f4d1db25003e0baddcaae462207c50c4d5742",
      "tree": "4ec86c5bdf0e9339547d2ec26985d7def3a201dd",
      "parents": [
        "9d1469d55967c45fc9b985efda9ceddd1a74a934"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 23 13:25:30 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 23 13:25:30 2015 -0800"
      },
      "message": "docs: support embedded anonymous property structs\n\nEmbedded anonymous structs have no name, use the type as the name for\nnow.  Eventually we should hide the name completely and put the\nproperties in the embedding struct.\n"
    },
    {
      "commit": "9d1469d55967c45fc9b985efda9ceddd1a74a934",
      "tree": "9e4f7e19560352dc2d5e2e4b976322750a1df322",
      "parents": [
        "83cedbec8582347a12b4233a34b269eebab3b0e6"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Nov 20 17:03:25 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Nov 20 17:26:52 2015 -0800"
      },
      "message": "Support embedded anonymous property structs\n\nAllow property structs to contain anonymous embedded structs and\ninterfaces.  Properties in an anonymous embedded struct or interface are\ntreated as if they were properties in the embedding struct.\n"
    },
    {
      "commit": "83cedbec8582347a12b4233a34b269eebab3b0e6",
      "tree": "ec18cfd7c6f071300642f0cd3312ba772a39b21c",
      "parents": [
        "5c11f817e1c09deaa0fc23b49d8defa679fc2f61"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Nov 20 17:01:25 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Nov 20 17:26:52 2015 -0800"
      },
      "message": "Fix ZeroProperties bug on nested interfaces\n\nZeroProperties was setting nested structs to their zero value, even if\nthey contained an interface that should be recursed into, not replaced\nwith nil.\n"
    },
    {
      "commit": "5c11f817e1c09deaa0fc23b49d8defa679fc2f61",
      "tree": "c22df678617fc149dd050b4904c430065aecea63",
      "parents": [
        "1af8a230c7cd2ae24ec67a1a44776ac26906775b",
        "6d529f0e16b861d3b504f622137858f4ad094d9a"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Nov 18 16:21:06 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Nov 18 16:21:06 2015 -0800"
      },
      "message": "Merge pull request #80 from colincross/optionalremove\n\nMake removing abandoned files optional"
    },
    {
      "commit": "1af8a230c7cd2ae24ec67a1a44776ac26906775b",
      "tree": "8cfd9fb6fdbae411b88554e987cfdb19f49bd21b",
      "parents": [
        "9bb9545db3c95ee282e3daf17ebc25732328a15f",
        "a259945b744f6f367c24ff01594412ee8147d454"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Nov 18 16:20:31 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Nov 18 16:20:31 2015 -0800"
      },
      "message": "Merge pull request #82 from colincross/builddir\n\nUse context builddir for removing abandoned files"
    },
    {
      "commit": "a259945b744f6f367c24ff01594412ee8147d454",
      "tree": "8cfd9fb6fdbae411b88554e987cfdb19f49bd21b",
      "parents": [
        "01739302cbf3c26e28bd8dcecc7dc90ae0bbdfc0"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Nov 18 16:01:01 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Nov 18 16:06:19 2015 -0800"
      },
      "message": "Use context builddir for removing abandoned files\n\nRemoving abandoned files needs to know where the .ninja_log file is\nstored.  Export the ninja builddir value from Context and use it to\ndetermine the .ninja_log path in any stage.\n\nThe ninja builddir (where ninja stores its .ninja_log and .ninja_deps\nfiles) and the bootstrap.BuildDir (where build output files are written)\nare distinct, so to reduce confusion replace SetBuildDir with\nSetNinjaBuildDir.\n"
    },
    {
      "commit": "9bb9545db3c95ee282e3daf17ebc25732328a15f",
      "tree": "5fadc24878b4006a78ba7b67c35cf38c1894d4e5",
      "parents": [
        "e6006362dab1494107f591c5ae3f168d8adbd512",
        "01739302cbf3c26e28bd8dcecc7dc90ae0bbdfc0"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Nov 18 15:33:36 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Nov 18 15:33:36 2015 -0800"
      },
      "message": "Merge pull request #81 from colincross/builddir\n\nAllow multiple calls to ctx.SetBuildDir"
    },
    {
      "commit": "6d529f0e16b861d3b504f622137858f4ad094d9a",
      "tree": "1cfb14acf3758886b11c093c7d5d0caee74dfc91",
      "parents": [
        "e6006362dab1494107f591c5ae3f168d8adbd512"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 17 16:16:58 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Nov 18 15:29:12 2015 -0800"
      },
      "message": "Make removing abandoned files optional\n\nBuild logic can now implement a RemoveAbandonedFiles, and the bootstrap\nlogic will only remove abandoned files if that method returns true.\nLeaving the method unimplemented will result in the existing behavior of\nalways removing abandoned files.\n"
    },
    {
      "commit": "01739302cbf3c26e28bd8dcecc7dc90ae0bbdfc0",
      "tree": "5fadc24878b4006a78ba7b67c35cf38c1894d4e5",
      "parents": [
        "e6006362dab1494107f591c5ae3f168d8adbd512"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Nov 18 15:15:41 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Nov 18 15:15:41 2015 -0800"
      },
      "message": "Allow multiple calls to ctx.SetBuildDir\n\nctx.SetBuildDir is called by the bootstrap singleton, which is always\nlast.  In order to allow the primary builder to set the directory for\n.ninja_log/.ninja_deps, remove the panic on multiple calls to\nctx.SetBuildDir, and always used the value passed by the first caller.\n"
    },
    {
      "commit": "e6006362dab1494107f591c5ae3f168d8adbd512",
      "tree": "661b073f5a139fc3b81b2bed3b279990d2fd59ba",
      "parents": [
        "5b082a9edff04208a0acdc72aad148d315661394",
        "fce63d3c8fa746e31c486b515b1bcce26760b15d"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Tue Nov 17 17:59:43 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dan@danw.org",
        "time": "Tue Nov 17 17:59:43 2015 -0800"
      },
      "message": "Merge pull request #78 from danw/ruledeps\n\nAdd common implicit deps to Rules"
    },
    {
      "commit": "5b082a9edff04208a0acdc72aad148d315661394",
      "tree": "c625da8a34234b2f8b881dcac97b1a32cb72cb0b",
      "parents": [
        "2efbb490236eafb37559bdf7a85c995991457e82",
        "ca3817145ced8eb2f0fa23d70ece03e48c076f21"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 17 17:49:51 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 17 17:49:51 2015 -0800"
      },
      "message": "Merge pull request #79 from colincross/enotdir\n\nEnd removing directories on ENOTDIR"
    },
    {
      "commit": "2efbb490236eafb37559bdf7a85c995991457e82",
      "tree": "aa10221fab5e021defb68c3585bbd9819a42f98e",
      "parents": [
        "33c55fe809a13ed3ae4e4147e0bc691161a4c249",
        "24ad58713895346828bd2d3d78a88d5bf7d12efb"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 17 17:49:11 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 17 17:49:11 2015 -0800"
      },
      "message": "Merge pull request #76 from colincross/variantmethods\n\nAdd variant methods to SingletonContext and Context"
    },
    {
      "commit": "33c55fe809a13ed3ae4e4147e0bc691161a4c249",
      "tree": "988d6562912ec662ccc86dbe4c13fb9489202567",
      "parents": [
        "ff7104f98ded5222d0dbd2cc7904cdef40a2f265",
        "9c1cbb4a0426726fe93850f4ee4d63f7c0f8df3a"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 17 17:48:59 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 17 17:48:59 2015 -0800"
      },
      "message": "Merge pull request #74 from dje4g/add-newline-2\n\nAdd blank line after build rules, for human readability."
    },
    {
      "commit": "fce63d3c8fa746e31c486b515b1bcce26760b15d",
      "tree": "85c4b9c8766bff11067cdfdffb7b431e938481c7",
      "parents": [
        "ff7104f98ded5222d0dbd2cc7904cdef40a2f265"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Nov 17 14:21:45 2015 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Nov 17 17:08:05 2015 -0800"
      },
      "message": "Add common implicit deps to Rules\n\nFor implicit dependencies that will be common to all users of a Rule,\nadd a new field \u0027CommandDeps\u0027 to the RuleParam. This is a list of\nstrings to be prepended to the implicit dependencies in each BuildParam.\n\nThis lets us have the dependencies declared next to where they are used,\ninstead of duplicated in areas that may be far apart.\n\nI looked at passing this information down to ninja too, but it only\nsaves us a few percent of ninja file, and requires a modification to the\nninja file format.\n\nChange-Id: Ifd910dee1506d4e32a76ed06206f853c4caec622\n"
    },
    {
      "commit": "24ad58713895346828bd2d3d78a88d5bf7d12efb",
      "tree": "8263283b19b0f93e35f5db3e5732819936093bf7",
      "parents": [
        "f5df83e7ee38c58a6b6bd78bb2940e4bb0e2e3e5"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 17 16:22:29 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 17 16:47:50 2015 -0800"
      },
      "message": "Add variant methods to SingletonContext and Context\n\nAdd VisitAllModuleVariants, PrimaryModule, and FinalModule to\nSingletonContext so singletons and tools can deal with modules with\nmultiple variants.\n"
    },
    {
      "commit": "ca3817145ced8eb2f0fa23d70ece03e48c076f21",
      "tree": "186428c56dfcb0e798e962c0fcb2f601a5f3820b",
      "parents": [
        "f5df83e7ee38c58a6b6bd78bb2940e4bb0e2e3e5"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 17 16:18:13 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 17 16:35:22 2015 -0800"
      },
      "message": "End removing directories on ENOTDIR\n\nAn abandoned directory may have been replaced with a file, give up on\nremoving the directory on ENOTDIR.\n"
    },
    {
      "commit": "ff7104f98ded5222d0dbd2cc7904cdef40a2f265",
      "tree": "fa427147818ca8581714a0e923b309ee37d39b9d",
      "parents": [
        "f5df83e7ee38c58a6b6bd78bb2940e4bb0e2e3e5",
        "a2cd69899ff170a7b5433ece123354cc701ea448"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 17 15:13:17 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 17 15:13:17 2015 -0800"
      },
      "message": "Merge pull request #75 from colincross/go15\n\nUpdate travis to use go 1.5"
    },
    {
      "commit": "f5df83e7ee38c58a6b6bd78bb2940e4bb0e2e3e5",
      "tree": "e8034651e21270b68560a289aa2922fcc1e77874",
      "parents": [
        "a17f75966049c9942e779e4970eb87c449022973",
        "fcc6739e34f83eb35ddea53df8c070c93d823d87"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Mon Nov 09 13:12:26 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Mon Nov 09 13:12:26 2015 -0800"
      },
      "message": "Merge pull request #72 from dje4g/build-rule-comments\n\nSupport comments in build rules."
    },
    {
      "commit": "a2cd69899ff170a7b5433ece123354cc701ea448",
      "tree": "8c7e04f2e6c868cd24f36a0f039cdc770abbe720",
      "parents": [
        "a17f75966049c9942e779e4970eb87c449022973"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 09 12:56:38 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 09 12:56:38 2015 -0800"
      },
      "message": "Update travis to use go 1.5\n\nUpdate .travis.yml to specify go 1.5.1, and update build.ninja.in to\ninclude the new in line function names used by go 1.5.\n"
    },
    {
      "commit": "9c1cbb4a0426726fe93850f4ee4d63f7c0f8df3a",
      "tree": "aeb219849023637fec39f689ffe3132667b4d2b2",
      "parents": [
        "a17f75966049c9942e779e4970eb87c449022973"
      ],
      "author": {
        "name": "Doug Evans",
        "email": "dje@chromium.org",
        "time": "Mon Nov 09 11:37:39 2015 -0800"
      },
      "committer": {
        "name": "Doug Evans",
        "email": "dje@chromium.org",
        "time": "Mon Nov 09 11:37:39 2015 -0800"
      },
      "message": "Add blank line after build rules, for human readability.\n"
    },
    {
      "commit": "fcc6739e34f83eb35ddea53df8c070c93d823d87",
      "tree": "e8034651e21270b68560a289aa2922fcc1e77874",
      "parents": [
        "a17f75966049c9942e779e4970eb87c449022973"
      ],
      "author": {
        "name": "Doug Evans",
        "email": "dje@chromium.org",
        "time": "Sun Nov 08 12:21:58 2015 -0800"
      },
      "committer": {
        "name": "Doug Evans",
        "email": "dje@chromium.org",
        "time": "Sun Nov 08 12:21:58 2015 -0800"
      },
      "message": "Support comments in build rules.\n\nTested: sh tests/test.sh\n"
    },
    {
      "commit": "a17f75966049c9942e779e4970eb87c449022973",
      "tree": "f9751c5530a7847551266d0656192df70912291c",
      "parents": [
        "d130c11bc7094b30b3444151a9731d0e494ea6ce",
        "7fcb7b00e4f2db537343ceea2115684229354bfc"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Nov 04 11:04:37 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Wed Nov 04 11:04:37 2015 -0800"
      },
      "message": "Merge pull request #69 from colincross/depserrors\n\nDon\u0027t rely on deps property position"
    },
    {
      "commit": "7fcb7b00e4f2db537343ceea2115684229354bfc",
      "tree": "ae687d330885b825d7203cd51ea86cdd96b7ba96",
      "parents": [
        "eeb5f9587396b9cadfa296742b06045888f8ad07"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 03 17:33:29 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 03 17:33:29 2015 -0800"
      },
      "message": "Don\u0027t rely on deps property position\n\nDependency errors were prefixed with ??? because they were associated\nwith the position of the \"deps\" property, which is often not used.  Use\nthe position of the module instead.\n"
    },
    {
      "commit": "d130c11bc7094b30b3444151a9731d0e494ea6ce",
      "tree": "06bf7c6cc1c273ce859b67202a9cecb3191c16b5",
      "parents": [
        "eeb5f9587396b9cadfa296742b06045888f8ad07",
        "8d8a7af4af5e091cfa207599734f722edde5f160"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 03 17:32:55 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 03 17:32:55 2015 -0800"
      },
      "message": "Merge pull request #67 from colincross/reversedependencies\n\nSort reverse dependencies"
    },
    {
      "commit": "eeb5f9587396b9cadfa296742b06045888f8ad07",
      "tree": "61fe7c3368e3d6a05ee488cf4a12ffc9b7253774",
      "parents": [
        "f401db416d655b89946558931d6580c7556c85e5",
        "045a59760380d959657d6a342f038a65a9f67562"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 03 17:32:47 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 03 17:32:47 2015 -0800"
      },
      "message": "Merge pull request #68 from colincross/selfdep\n\nPrint useful error for self-dependency"
    },
    {
      "commit": "045a59760380d959657d6a342f038a65a9f67562",
      "tree": "61fe7c3368e3d6a05ee488cf4a12ffc9b7253774",
      "parents": [
        "f401db416d655b89946558931d6580c7556c85e5"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 03 16:58:48 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 03 17:00:26 2015 -0800"
      },
      "message": "Print useful error for self-dependency\n\nbeforeInModuleList panic\u0027d when checking if a variant was before itself\nin the module list.  Return a real error instead of calling\nbeforeInModuleList, and also fix beforeInModuleList to return false for\nthe same module.\n"
    },
    {
      "commit": "8d8a7af4af5e091cfa207599734f722edde5f160",
      "tree": "8896fad6e2b0200201eb9356bca27cad74731b4c",
      "parents": [
        "f401db416d655b89946558931d6580c7556c85e5"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 03 16:41:29 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 03 16:41:29 2015 -0800"
      },
      "message": "Sort reverse dependencies\n\nAddReverseDependencies would add modules the target\u0027s dependency list in\na non-deterministic order based on the order the modules were parsed.\nRedefine AddReverseDependencies to collect dependencies until the end of\nthe mutator and then add them sorted by name.\n"
    },
    {
      "commit": "f401db416d655b89946558931d6580c7556c85e5",
      "tree": "4b59d34d4545a3a14a35374ee49da9aa05a3d3d7",
      "parents": [
        "cd206b2ca09965d8aea6f56c4a2ee86cc0731419",
        "a2ca92c9624fb090d24cde6e2ed8b5fb56546c9f"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 03 14:42:24 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 03 14:42:24 2015 -0800"
      },
      "message": "Merge pull request #65 from colincross/propertyerrors\n\nImprove PropertyErrorf"
    },
    {
      "commit": "cd206b2ca09965d8aea6f56c4a2ee86cc0731419",
      "tree": "e2f2dc32a0863fa4403b2e7055fbd7b1105cb2b2",
      "parents": [
        "f95966fae802dbb1e808ed49ef018e7aa1335824",
        "8d22233f802e3116f94cc36b3833e96371ebcc27"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 03 14:42:07 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Tue Nov 03 14:42:07 2015 -0800"
      },
      "message": "Merge pull request #66 from colincross/othermodule\n\nAdd OtherModuleName and OtherModuleErrorf to mutators"
    },
    {
      "commit": "8d22233f802e3116f94cc36b3833e96371ebcc27",
      "tree": "e2f2dc32a0863fa4403b2e7055fbd7b1105cb2b2",
      "parents": [
        "f95966fae802dbb1e808ed49ef018e7aa1335824"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 02 16:11:32 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 03 14:31:39 2015 -0800"
      },
      "message": "Add OtherModuleName and OtherModuleErrorf to mutators\n\nTopDownMutators can visit dependencies, provide OtherModuleName and\nOtherModuleErrorf so they can query and report errors on those\ndependencies.\n"
    },
    {
      "commit": "a2ca92c9624fb090d24cde6e2ed8b5fb56546c9f",
      "tree": "a06bcdcfc3864c6e91d199396afbb4d7a76b4d6b",
      "parents": [
        "f95966fae802dbb1e808ed49ef018e7aa1335824"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 02 16:10:23 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Nov 03 14:31:19 2015 -0800"
      },
      "message": "Improve PropertyErrorf\n\nPropertyErrorf gets called from build logic, and shouldn\u0027t panic if the\nbuild logic reports an error on an unset property.  Fall back to using\nthe module position if the property wasn\u0027t set.\n\nAlso put the property name into the error message.\n"
    },
    {
      "commit": "f95966fae802dbb1e808ed49ef018e7aa1335824",
      "tree": "3c9f9ef4f586e3c8b2aae37e131c7767e00718ec",
      "parents": [
        "75c938b6ed6b97a2b7a695a37ba6af160c3289fb",
        "e4b0d3596697858cfcf6dd3e4ab376a2905c8e2c"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Mon Nov 02 18:35:09 2015 -0800"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Mon Nov 02 18:35:09 2015 -0800"
      },
      "message": "Merge pull request #64 from colincross/appendproperties\n\nGeneric append properties, and *bool support"
    },
    {
      "commit": "e4b0d3596697858cfcf6dd3e4ab376a2905c8e2c",
      "tree": "3c9f9ef4f586e3c8b2aae37e131c7767e00718ec",
      "parents": [
        "80117687294aaebcdc1df11a456cd1655e58ab8d"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 02 14:58:10 2015 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 02 15:40:55 2015 -0800"
      },
      "message": "Add proptools.TypeEqual\n\nWhen appending properties, it may be necessary to determine if two\nproperty structs are the same \"type\".  A simple Go type comparison is\nnot sufficient, as there may be interface{} values in the property\nstructs that contain different types.  Add proptools.TypeEqual that\nreturns true if they have equal types and all embedded pointers to\nstructs and interfaces to pointers to structs have the same nilitude and\ntype.\n"
    },
    {
      "commit": "80117687294aaebcdc1df11a456cd1655e58ab8d",
      "tree": "31c3add8cd2d3de933a36e8e2b41e70e6a7b9d72",
      "parents": [
        "ecca05efb23c43093afeb97a922cdfdb7c6248f6"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Oct 30 15:53:55 2015 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Nov 02 13:59:12 2015 -0800"
      },
      "message": "Add property support for pointers to bools and strings\n\nThe only append semantics for bool that result in a no-op when the zero\nvalue is appended is to OR the two values together, but that is rarely\nthe desired semantics.  Add support for *bool and *string as property\ntypes, where appending a nil pointer is a no-op.  For *bool, appending a\nnon-nil pointer replaces the destination with the value.  For *string,\nappending a non-nil pointer appends the value.\n\nThis also provides a more reliable replacement for\nModuleContext.ContainsProperty, as the  build logic can tell that the\nproperty was set, even if it was set by a  mutator and not by the\nblueprints file, by testing against nil.\n\n[]string already provides these semantics for lists.\n\nSetting a *bool or *string property from a blueprints file is the same\nsyntax as setting a bool or a string property.\n"
    },
    {
      "commit": "ecca05efb23c43093afeb97a922cdfdb7c6248f6",
      "tree": "27b98553c53c3a8c529c4234a14ca340c20a15d2",
      "parents": [
        "f72ef5023cd2554eb28bc9457c1d3b64575ecc43"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sat Oct 31 21:32:08 2015 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sat Oct 31 21:33:32 2015 -0700"
      },
      "message": "Fix unpacking empty list\n\nAdd a test for unpacking empty list properties and fix a bug that\nresulted in nil slice instead of an empty slice.\n"
    },
    {
      "commit": "f72ef5023cd2554eb28bc9457c1d3b64575ecc43",
      "tree": "ec1344f2b9bedc30aaac45360413ebd91fc9be4e",
      "parents": [
        "8169500cddbbfc89dc62381aaaa6fcff4fd6b4cc"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Oct 30 11:42:57 2015 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sat Oct 31 20:10:20 2015 -0700"
      },
      "message": "Fix bugs in CloneProperties and related functions\n\nAdd tests for CloneProperties, CloneEmptyProperties and ZeroProperties\nand fix detected bugs related to nil pointers to structs and interfaces\ncontaining nil pointers to structs.\n"
    },
    {
      "commit": "8169500cddbbfc89dc62381aaaa6fcff4fd6b4cc",
      "tree": "50be7f02288130ed8fc4e8a85194290d6ce7d99f",
      "parents": [
        "0bc7e077ebfe716c6353c6fe5b9c01087867ee12"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Oct 30 13:19:14 2015 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sat Oct 31 20:10:20 2015 -0700"
      },
      "message": "Move CloneProperties to clone.go\n\nMove CloneProperties, CloneEmptyProperties, and ZeroProperties from\nproptools/proptools.go to proptools/clone.go.\n"
    },
    {
      "commit": "0bc7e077ebfe716c6353c6fe5b9c01087867ee12",
      "tree": "97397f676755e70ca8e9a133faa115b2f0afcde6",
      "parents": [
        "75c938b6ed6b97a2b7a695a37ba6af160c3289fb"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Oct 27 18:15:15 2015 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sat Oct 31 20:09:58 2015 -0700"
      },
      "message": "Add helpers for extending properties to proptools\n\nIt is common for a mutator to append or prepend property structs\ntogether.  Add helper functions to append or prepend properties in property\nstructs.  The append operation is defined as appending string and slices\nof strings normally, OR-ing bool values, and recursing into embedded\nstructs, pointers to structs, and interfaces containing pointers to\nstructs.  Appending or prepending the zero value of a property will\nalways be a no-op.\n"
    },
    {
      "commit": "75c938b6ed6b97a2b7a695a37ba6af160c3289fb",
      "tree": "30cd3cf46aec8526a8b70d881defca5c2de8fd93",
      "parents": [
        "45021dcbbdf762b57878704adc1443e96169ea2e",
        "763b6f18fa865a52f64fda453f471ee02f63a50a"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Oct 30 20:59:20 2015 -0700"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Oct 30 20:59:20 2015 -0700"
      },
      "message": "Merge pull request #63 from colincross/deprecate\n\nDeprecate EarlyMutator and DynamicDependencies"
    },
    {
      "commit": "763b6f18fa865a52f64fda453f471ee02f63a50a",
      "tree": "30cd3cf46aec8526a8b70d881defca5c2de8fd93",
      "parents": [
        "45021dcbbdf762b57878704adc1443e96169ea2e"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Oct 29 15:32:56 2015 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Oct 29 16:03:37 2015 -0700"
      },
      "message": "Deprecate EarlyMutator and DynamicDependencies\n\nDynamicDependencies can be implemented more flexibly by a\nBottomUpMutator.  If there are no DynamicDependencies, then\nEarlyMutators are identical to BottomUpMutators.  Deperecate both, and\nreimplement DynamicDependencies inside a BottomUpMutator that is\nguaranteed to be registered first.\n"
    },
    {
      "commit": "45021dcbbdf762b57878704adc1443e96169ea2e",
      "tree": "6f476cf8bcc5c817c19d685dd401f255835fa6d5",
      "parents": [
        "e12c78095755517799fe022b70fdf93d6896dcab",
        "f995846a4b19fa37f7e572788f1a64dd6a82061c"
      ],
      "author": {
        "name": "jgennis",
        "email": "jgennis@gmail.com",
        "time": "Sat Oct 10 00:53:42 2015 -0700"
      },
      "committer": {
        "name": "jgennis",
        "email": "jgennis@gmail.com",
        "time": "Sat Oct 10 00:53:42 2015 -0700"
      },
      "message": "Merge pull request #61 from yuchenericwu2/master\n\nAdd walkDeps to context and module_ctx."
    },
    {
      "commit": "f995846a4b19fa37f7e572788f1a64dd6a82061c",
      "tree": "6f476cf8bcc5c817c19d685dd401f255835fa6d5",
      "parents": [
        "222e2458b1551080d82da5958662740e03164e6d"
      ],
      "author": {
        "name": "Yuchen Wu",
        "email": "yuchenericwu@google.com",
        "time": "Fri Oct 09 17:31:27 2015 -0700"
      },
      "committer": {
        "name": "Yuchen Wu",
        "email": "yuchenericwu@google.com",
        "time": "Fri Oct 09 17:57:00 2015 -0700"
      },
      "message": "Added test for walkDeps.\n"
    },
    {
      "commit": "222e2458b1551080d82da5958662740e03164e6d",
      "tree": "4a2fc47545e5451f3b9376c2359cd44b862370e9",
      "parents": [
        "e12c78095755517799fe022b70fdf93d6896dcab"
      ],
      "author": {
        "name": "Yuchen Wu",
        "email": "yuchenericwu@google.com",
        "time": "Tue Oct 06 14:03:27 2015 -0700"
      },
      "committer": {
        "name": "Yuchen Wu",
        "email": "yuchenericwu@google.com",
        "time": "Tue Oct 06 20:03:07 2015 -0700"
      },
      "message": "Add walkDeps to context and module_ctx.\n\nwalkDeps performs a pre-order DFS (unlike visitDepsDepthFirst which is\na post-order DFS). The visit function takes in both a parent and child\nnode and returns a bool indicating if the child node should be\ntraversed.\n"
    },
    {
      "commit": "e12c78095755517799fe022b70fdf93d6896dcab",
      "tree": "4ce7d0f114b58a00c956826142c48348f401502d",
      "parents": [
        "1d92826852fc44698e36458929b839485ade00a3",
        "6d8780f724b092458aca76dd4ef9c9ff44570351"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Sep 18 12:39:46 2015 -0700"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Sep 18 12:39:46 2015 -0700"
      },
      "message": "Merge pull request #44 from colincross/local\n\nFix bugs related to local vs. inherited variables"
    },
    {
      "commit": "1d92826852fc44698e36458929b839485ade00a3",
      "tree": "666ae382e0142cde4581787d226c7ba86e8b0861",
      "parents": [
        "d7f00ccf5ffbe79576878239015d2fd4b7d1daad",
        "c7697ce79d62eb2298e890ec26bbf9dc80454542"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Sep 18 10:55:28 2015 -0700"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Fri Sep 18 10:55:28 2015 -0700"
      },
      "message": "Merge pull request #57 from danw/testrunner\n\nAdd a test runner"
    },
    {
      "commit": "c7697ce79d62eb2298e890ec26bbf9dc80454542",
      "tree": "666ae382e0142cde4581787d226c7ba86e8b0861",
      "parents": [
        "d7f00ccf5ffbe79576878239015d2fd4b7d1daad"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Sep 17 20:59:51 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Sep 18 10:28:36 2015 -0700"
      },
      "message": "Add a test runner\n\nThis removes the need to use $OLDPWD when running tests, which means\nthat the builddir may be an absolute or relative directory. It also\nfilters out the \"PASS\" message on successful test runs to clean up our\noutput.\n\nChange-Id: I4ab937c7a87b74fe997a47cc0311e2f357f9f7e9\n"
    },
    {
      "commit": "d7f00ccf5ffbe79576878239015d2fd4b7d1daad",
      "tree": "72d18b61879e7b54e268b35d2210d9b2d073750c",
      "parents": [
        "8282be78eea2785a3a63a6e1fa29574271993e97",
        "991f7603cdaaceddde0773d5ceb86cffe320750c"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu Sep 17 23:36:47 2015 -0700"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Thu Sep 17 23:36:47 2015 -0700"
      },
      "message": "Merge pull request #58 from danw/builddir\n\nStop using bootstrap.bash -b for separate builddir"
    },
    {
      "commit": "991f7603cdaaceddde0773d5ceb86cffe320750c",
      "tree": "72d18b61879e7b54e268b35d2210d9b2d073750c",
      "parents": [
        "8282be78eea2785a3a63a6e1fa29574271993e97"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Sep 17 22:48:04 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Sep 17 23:18:03 2015 -0700"
      },
      "message": "Stop using bootstrap.bash -b for separate builddir\n\nIt\u0027s difficult for wrapping scripts to handle -b properly. Just pass\nBUILDDIR instead, which is easier to handle. This still accepts -b, so\nthat incremental builds work across this change.\n"
    },
    {
      "commit": "8282be78eea2785a3a63a6e1fa29574271993e97",
      "tree": "52c201b511ef3ec81c1c6808ff9779fea10f51e7",
      "parents": [
        "f5d4fb0626532284e02984ff48a17d949ff89c73",
        "fdeb724f74406592726eae2135e8a9db90996eb6"
      ],
      "author": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Mon Sep 14 16:01:46 2015 -0700"
      },
      "committer": {
        "name": "colincross",
        "email": "github@colincross.com",
        "time": "Mon Sep 14 16:01:46 2015 -0700"
      },
      "message": "Merge pull request #49 from danw/plugins\n\nImplement go bootstrap plugins"
    }
  ],
  "next": "f5d4fb0626532284e02984ff48a17d949ff89c73"
}
