)]}'
{
  "commit": "d924dda3e1f9fdbe616735d98fa1a4f3a5cb37d0",
  "tree": "c5be11cc3a5fe9f2b2b9e30e519d5a3704bc66e5",
  "parents": [
    "fa27ae413a90100606cc189dc5011fe8b1de05b3",
    "e4f85add0284186af7350d1d9762195a04f3dcbc"
  ],
  "author": {
    "name": "Martin Fick",
    "email": "martin.fick@linaro.org",
    "time": "Tue Sep 13 14:22:08 2022 -0600"
  },
  "committer": {
    "name": "Martin Fick",
    "email": "martin.fick@linaro.org",
    "time": "Tue Sep 13 15:15:56 2022 -0600"
  },
  "message": "Merge branch \u0027stable-3.1\u0027 into stable-3.2\n\n* stable-3.1 (27 commits)\n  Use shallow clone while expanding definitions\n  Move match() and matchOrNull() to MatchCache\n  fixup! Cache Task definition lists for ChangeNodes\n  Cache Task definition lists for ChangeNodes\n  Split SubNodeFactory out of SubNodeAdder\n  Moving caching logic out of loadSubNodes()\n  Use a TaskTree.Node.Invalid instead of nulls\n  Use overloading for special cases instead of nulls\n  Add a TaskTree ApplicableNodeFilter\n  Add an isCacheableByBranch() to the PredicateCache\n  Track whether Task.applicable needs to be refreshed\n  Allow Expander to expand a single Task\u0027s field\n  Minor cleanup of task Properties.expandText()\n  Remove cached Change subNodes on Node completion\n  Explicitly signal end of Task Properties expansion\n  Use a SubNodeAdder to add TaskTree SubNodes\n  Avoid hard coding the refs/meta/config ref\n  Inject All-Projects in TaskConfigFactory\n  Change TaskExpressions to iterate over TaskKeys\n  Avoid passing isTrusted in TaskConfigFactory.getTaskConfig()\n  ...\n\nChange-Id: I783f00289dff687f066d395862ec790e2fe058b5\n",
  "tree_diff": []
}
