)]}'
{
  "log": [
    {
      "commit": "305a2d029f471d94759da7b304f886723cab6ba5",
      "tree": "2cf7a2e9ca63dbb85c80de280e5344466e7fce9e",
      "parents": [
        "84e7e16d35f7300bc5f4b6cca85deaf1b5a45263"
      ],
      "author": {
        "name": "Masaya Suzuki",
        "email": "masayasuzuki@google.com",
        "time": "Mon Nov 13 10:48:34 2017 -0800"
      },
      "committer": {
        "name": "Masaya Suzuki",
        "email": "masayasuzuki@google.com",
        "time": "Mon Nov 13 15:48:49 2017 -0800"
      },
      "message": "Support --push-option in upload subcommand\n\nChange-Id: I44836f8c66ded5a96cbf5431912e027e681f6529\n"
    },
    {
      "commit": "f46902a800f508061322a36b1969f51a7e95df16",
      "tree": "b0865343f7fa5702bf16c7662852b45f6119c084",
      "parents": [
        "c00d28b767240ef17a0402a7d55a7a6197ce2815"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Tue Oct 31 12:27:17 2017 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Tue Oct 31 13:07:55 2017 +0900"
      },
      "message": "forall: Clarify expansion of REPO_ environment values with -c\n\nIf a user executes:\n\n  repo forall -c echo $REPO_PROJECT\n\nthen $REPO_NAME is expanded by the user\u0027s shell first, and passed\nas $1 to the shell that executes echo. This will either result in\nno output, or output of whatever REPO_NAME is set to in the user\u0027s\nshell. Either way, this is an unexpected result.\n\nThe correct way to do it is:\n\n  repo forall -c \u0027echo $REPO_PROJECT\u0027\n\nsuch that $REPO_NAME is passed in to the shell literally, and then\nexpanded to the value set in the environment that was passed to\nthe shell.\n\nUpdate the documentation to make this clearer.\n\nChange-Id: I713caee914172ad8d8f0fafacd27026502436f0d\n"
    },
    {
      "commit": "010fed771183c23c0e7d04a4e7292782f68de9db",
      "tree": "438b928fa1adaa7105d88462299513ca59c47c9f",
      "parents": [
        "e8595e9df7980b0b7d9111de43d294c4439d474c"
      ],
      "author": {
        "name": "Renaud Paquay",
        "email": "rpaquay@google.com",
        "time": "Fri Nov 11 14:25:29 2016 -0800"
      },
      "committer": {
        "name": "Renaud Paquay",
        "email": "rpaquay@google.com",
        "time": "Thu Aug 31 13:49:36 2017 -0700"
      },
      "message": "Replace all os.remove calls\n\nos.remove raises an exception when deleting read-only files on\nWindows. Replace all calls with calls to platform_utils.remove,\nwhich deals with deals with that issue.\n\nChange-Id: I4dc9e0c9a36b4238880520c69f5075eca40f3e66\n"
    },
    {
      "commit": "227ad2ef42f47798d24814dfc2cef8119c313ab7",
      "tree": "0702d4dac67f59072edc6587122c27f4753021a5",
      "parents": [
        "2a4be948788dfe5ae9437b048fba229a96bbff2d"
      ],
      "author": {
        "name": "Renaud Paquay",
        "email": "rpaquay@google.com",
        "time": "Tue Nov 01 14:37:13 2016 -0700"
      },
      "committer": {
        "name": "Renaud Paquay",
        "email": "rpaquay@google.com",
        "time": "Thu Aug 31 13:49:01 2017 -0700"
      },
      "message": "Implement islink, readlink and realpath using Win32 api\n\nChange-Id: I18452cbb32d24db73601ad10485dbe6bb278731c\n"
    },
    {
      "commit": "2c57d619bca9b946eeaa4f5b88397b9e1460cf35",
      "tree": "40a44a05a9d1a3cd12121f4afe8e8374f9e46da6",
      "parents": [
        "d1ebc89a083f2966f8c65246bb63e2deaadfab62",
        "bed59cec5e5a9a5668cf2c7df3a24545b1e76c09"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Aug 30 15:11:10 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 30 15:11:10 2017 +0000"
      },
      "message": "Merge \"Add option \u0027--no-cert-checks\u0027 for \u0027upload\u0027 sub command.\""
    },
    {
      "commit": "d1ebc89a083f2966f8c65246bb63e2deaadfab62",
      "tree": "cd6bd047ba2c7b83a25ba045a48efa95393f7fbe",
      "parents": [
        "9ead97bb51f5b1ad1d0a45e0c5442f15e1e38fd7",
        "ad1abcb556bfff2744928a8f29d216aee43fdbe3"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Aug 30 10:24:03 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 30 10:24:03 2017 +0000"
      },
      "message": "Merge changes from topic \"windows-support\"\n\n* changes:\n  Port os.rename calls to work on Windows\n  Workaround shutil.rmtree limitation on Windows\n  Add support for creating symbolic links on Windows\n  Make \"git command\" and \"forall\" work on Windows\n"
    },
    {
      "commit": "9ead97bb51f5b1ad1d0a45e0c5442f15e1e38fd7",
      "tree": "4edd8cc4d061a3c8971fd6d55a547320120ad10b",
      "parents": [
        "e43322625a423c2dc7aa8b0648c172ccbe7aefa7"
      ],
      "author": {
        "name": "Zac Livingston",
        "email": "zacl@codeaurora.org",
        "time": "Tue Jun 13 08:29:04 2017 -0600"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Fri Aug 25 09:10:29 2017 +0900"
      },
      "message": "When starting a branch, do not use a tag or change value for branch.merge\n\nWhen starting a branch, branch.merge is set to project revision unless\nthe revision is a SHA1. In that case, branch.merge is set to dest_branch\nif defined or manifest default revision otherwise. This special handling\nallows repo upload to work when the project revision is a SHA1.\n\nExtend the special handling to also happen when the project revision\nis a tag value or a change value so that repo upload will work in those\ncase as well.\n\nChange-Id: Iff81ece40e770cd02535e80dcb023564d42dcf47\n"
    },
    {
      "commit": "bed59cec5e5a9a5668cf2c7df3a24545b1e76c09",
      "tree": "f7569ff48632187517e5df8dd2d3cb5850691593",
      "parents": [
        "c94d6eb90233421b431adbd5a01b7ec24729a285"
      ],
      "author": {
        "name": "Łukasz Gardoń",
        "email": "garjack555@gmail.com",
        "time": "Tue Aug 08 10:18:11 2017 +0200"
      },
      "committer": {
        "name": "Łukasz Gardoń",
        "email": "garjack555@gmail.com",
        "time": "Wed Aug 23 14:06:14 2017 +0200"
      },
      "message": "Add option \u0027--no-cert-checks\u0027 for \u0027upload\u0027 sub command.\n\nThis option allow to bypass verification ssl certification while\nestablishing connection with Gerrit to upload review.\n\nChange-Id: If2e15f5a273c18a700eb5093ca8a4d5a4cbf80cd\n"
    },
    {
      "commit": "c94d6eb90233421b431adbd5a01b7ec24729a285",
      "tree": "ab8bb74e27b845419ef57048044d758ff3eb1d3f",
      "parents": [
        "d88f53e2b9634b9645f80b2d8e653beac24711fe"
      ],
      "author": {
        "name": "Jonathan Nieder",
        "email": "jrn@google.com",
        "time": "Tue Aug 08 18:34:53 2017 +0000"
      },
      "committer": {
        "name": "Jonathan Nieder",
        "email": "jrn@google.com",
        "time": "Tue Aug 08 18:34:53 2017 +0000"
      },
      "message": "Revert \"Migrate git-repo to create private changes rather than drafts\"\n\nThis reverts commit d88f53e2b9634b9645f80b2d8e653beac24711fe. I merged\nit too hastily without paying enough attention to compatibility with\nreleased Gerrit versions.\n\nChange-Id: I4028d4737df1255f11e217da183a19a010597d5b\n"
    },
    {
      "commit": "d88f53e2b9634b9645f80b2d8e653beac24711fe",
      "tree": "7fc6d88e282aa7d11322549f900b6708f135ab3f",
      "parents": [
        "87984c6db4962043c2b9e5a5a4a30eaf6d066077"
      ],
      "author": {
        "name": "Changcheng Xiao",
        "email": "xchangcheng@google.com",
        "time": "Mon Aug 07 15:05:46 2017 +0200"
      },
      "committer": {
        "name": "Changcheng Xiao",
        "email": "xchangcheng@google.com",
        "time": "Mon Aug 07 15:08:18 2017 +0200"
      },
      "message": "Migrate git-repo to create private changes rather than drafts\n\nConsidering that some users might expect changes created with\n\u0027-d\u0027 option are not public. Private changes may be a better\nchoice here than work-in-progress changes.\n\nChange-Id: I46a8fb9ae38beb41cf96d6abe82bea6db2439669\n"
    },
    {
      "commit": "87984c6db4962043c2b9e5a5a4a30eaf6d066077",
      "tree": "ab8bb74e27b845419ef57048044d758ff3eb1d3f",
      "parents": [
        "ffc1401327b8240badd6fc62c6f85beca0350b44"
      ],
      "author": {
        "name": "Changcheng Xiao",
        "email": "xchangcheng@google.com",
        "time": "Wed Aug 02 16:55:03 2017 +0200"
      },
      "committer": {
        "name": "Changcheng Xiao",
        "email": "xchangcheng@google.com",
        "time": "Mon Aug 07 15:02:39 2017 +0200"
      },
      "message": "Add options for git-repo to support private and wip changes\n\nThis change adds options for git-repo tool to support private\nchanges and work-in-progress changes.\n\nChange-Id: I343491f5949f06f1580d53f9cc0dee2dca09130f\n"
    },
    {
      "commit": "ffc1401327b8240badd6fc62c6f85beca0350b44",
      "tree": "f22621190ac75296b704a537348c51b2c80b449e",
      "parents": [
        "8a6eeed7f5ba12f0aaa0fc9f62063a88039234d4",
        "7482a96443bf99234b5a150656014a1c54e336a6"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Aug 02 07:19:45 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 02 07:19:45 2017 +0000"
      },
      "message": "Merge \"download: try to choose . as default project if none\""
    },
    {
      "commit": "8a6eeed7f5ba12f0aaa0fc9f62063a88039234d4",
      "tree": "89994e0e6a21839532385f029b1784e09a5b9c27",
      "parents": [
        "3bcd30545e58bc5d6932c9390e8909d57a836617",
        "7be072efa6522a94ee0bab16539a442cc4713d65"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Aug 02 07:01:08 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 02 07:01:08 2017 +0000"
      },
      "message": "Merge \"Always print percentage when syncing quietly\""
    },
    {
      "commit": "7be072efa6522a94ee0bab16539a442cc4713d65",
      "tree": "96c5577a829b6df2e7b2fd5f6ea35e7ba6177a26",
      "parents": [
        "224a31a765eb943443640301a715d2d4eb005b79"
      ],
      "author": {
        "name": "Tim Schumacher",
        "email": "timschumi2@arcor.de",
        "time": "Wed Jun 28 18:29:23 2017 +0200"
      },
      "committer": {
        "name": "Tim Schumacher",
        "email": "timschumi2@arcor.de",
        "time": "Sat Jul 15 16:44:55 2017 +0000"
      },
      "message": "Always print percentage when syncing quietly\n\nChange-Id: I574396e63520781067ed1e991c41caf7640e5731\n"
    },
    {
      "commit": "7482a96443bf99234b5a150656014a1c54e336a6",
      "tree": "b4ae06ce456f092d73890042f4b89b480555d699",
      "parents": [
        "224a31a765eb943443640301a715d2d4eb005b79"
      ],
      "author": {
        "name": "Nicolas Cornu",
        "email": "nicolac76@yahoo.fr",
        "time": "Thu Jun 29 09:15:54 2017 +0200"
      },
      "committer": {
        "name": "Nicolas Cornu",
        "email": "nicolac76@yahoo.fr",
        "time": "Wed Jul 12 10:15:06 2017 +0200"
      },
      "message": "download: try to choose . as default project if none\n\nChange-Id: I28b5e3be5f3c9a4c077af87d6a3e0cc3b96a1b9d\n"
    },
    {
      "commit": "3bcd30545e58bc5d6932c9390e8909d57a836617",
      "tree": "287bcc992e76ced897981d225e5efe8f399c9693",
      "parents": [
        "224a31a765eb943443640301a715d2d4eb005b79"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon Jul 10 22:42:22 2017 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon Jul 10 23:26:04 2017 +0000"
      },
      "message": "Fix \"list comprehension redefines \u0027x\u0027\" warnings from pyflakes\n\n  $ git ls-files | grep py$ | xargs pyflakes\n  subcmds/stage.py:101: list comprehension redefines \u0027p\u0027 from line 63\n  subcmds/sync.py:784: list comprehension redefines \u0027p\u0027 from line 664\n  subcmds/upload.py:467: list comprehension redefines \u0027avail\u0027 from line 454\n\nChange-Id: Ia65d1a72ed185ab3357e1a91ed4450c719e75a7c\n"
    },
    {
      "commit": "224a31a765eb943443640301a715d2d4eb005b79",
      "tree": "e32deed53d2576e43f8250d22c2a0e44f7e5d558",
      "parents": [
        "b54343d9fd682bcdb1510042d93fdf38979b9eb7"
      ],
      "author": {
        "name": "Martin Kelly",
        "email": "mkelly@xevo.com",
        "time": "Mon Jul 10 14:46:25 2017 -0700"
      },
      "committer": {
        "name": "Martin Kelly",
        "email": "mkelly@xevo.com",
        "time": "Mon Jul 10 14:50:52 2017 -0700"
      },
      "message": "init: add missing submodule arg\n\nThe submodule argument to Sync_LocalHalf was missing in\nMetaBranchSwitch, causing submodules not to get synced when the\n-b/--manifest-branch argument to init is used.\n\nChange-Id: Ie86d271abac2020725770be36ead83be3326e64b\nSigned-off-by: Martin Kelly \u003cmkelly@xevo.com\u003e\n"
    },
    {
      "commit": "b54343d9fd682bcdb1510042d93fdf38979b9eb7",
      "tree": "be75474d1f7346d38b2e0da426d4a7a467ca7c16",
      "parents": [
        "259f16520acafbe85ee68deb43fa74ae56e1c617"
      ],
      "author": {
        "name": "Nicolas Cornu",
        "email": "nicolac76@yahoo.fr",
        "time": "Mon Jul 10 10:31:24 2017 +0200"
      },
      "committer": {
        "name": "Nicolas Cornu",
        "email": "nicolac76@yahoo.fr",
        "time": "Mon Jul 10 13:20:01 2017 +0000"
      },
      "message": "Tell the user if it will upload a draft\n\nChange-Id: Ie004ec9d61603f3f618c47597947b82c59f2839c\n"
    },
    {
      "commit": "259f16520acafbe85ee68deb43fa74ae56e1c617",
      "tree": "4d02a1ae04b78863e7e295dff8b949a00e719b21",
      "parents": [
        "8419ab22d69ed0d89809f322aef16105ad6bb127",
        "913327f10c73c53edca6421a48c116b87b207b15"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Jun 28 04:24:03 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Jun 28 04:24:03 2017 +0000"
      },
      "message": "Merge \"Add a newline after \"Fetching projects\" progress output\""
    },
    {
      "commit": "8419ab22d69ed0d89809f322aef16105ad6bb127",
      "tree": "531c8ee1efdc3455317aa09856312a8724b6ba2e",
      "parents": [
        "35d22217a5ed2f8b5b9b183217923071ccfe7f37"
      ],
      "author": {
        "name": "Nicolas Cornu",
        "email": "nicolac76@yahoo.fr",
        "time": "Fri Jun 16 12:09:06 2017 +0200"
      },
      "committer": {
        "name": "Nicolas Cornu",
        "email": "nicolac76@yahoo.fr",
        "time": "Fri Jun 16 12:23:26 2017 +0200"
      },
      "message": "sync: Continue job if some fetchs failed but force-broken is set\n\nWith --force-broken it continue to fetch other projects but nothing\nis added in directory because it abort some lines later.\n\nChange-Id: I32c4a4619b3028893dc4f98e8d4e5bc5c09adb27\n"
    },
    {
      "commit": "913327f10c73c53edca6421a48c116b87b207b15",
      "tree": "308e308ea5ab4d0cf396a814952983600e063bde",
      "parents": [
        "35d22217a5ed2f8b5b9b183217923071ccfe7f37"
      ],
      "author": {
        "name": "Tim Schumacher",
        "email": "timschumi2@arcor.de",
        "time": "Mon Jun 05 15:01:41 2017 +0200"
      },
      "committer": {
        "name": "Tim Schumacher",
        "email": "timschumi2@arcor.de",
        "time": "Tue Jun 13 13:03:39 2017 +0200"
      },
      "message": "Add a newline after \"Fetching projects\" progress output\n\nOutput before change:\n\n    Fetching project platform/packages/providers/UserDictionaryProvider\n    Fetching projects:  66% (773/1171)  Fetching project platform/external/regex-re2\n    Fetching project device/generic/mini-emulator-x86_64\n\nOutput after change:\n\n    Fetching project platform/packages/providers/UserDictionaryProvider\n    Fetching projects:  66% (773/1171)\n    Fetching project platform/external/regex-re2\n    Fetching project device/generic/mini-emulator-x86_64\n\nChange-Id: I4da84da58316c69294e4da2792f83885dc942701\n"
    },
    {
      "commit": "a65adf74f990eeac0d90011476376c7239cb7af5",
      "tree": "9278d9ce7c8d68a85dd049ed1ea5b64d84135fc0",
      "parents": [
        "d5cec5e752821ca2710101b626b3a3ca07fdb7f8"
      ],
      "author": {
        "name": "Renaud Paquay",
        "email": "rpaquay@google.com",
        "time": "Thu Nov 03 10:37:53 2016 -0700"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon May 29 19:32:31 2017 +0900"
      },
      "message": "Workaround shutil.rmtree limitation on Windows\n\nBy default, shutil.rmtree raises an exception when deleting readonly\nfiles on Windows.\n\nReplace all shutil.rmtree with platform_utils.rmtree, which adds an\nerror handler to make files read-write when they can\u0027t be deleted.\n\nChange-Id: I9cfea9a7b3703fb16a82cf69331540c2c179ed53\n"
    },
    {
      "commit": "2e7029116204cf2d6f516e4514091f0b492bc689",
      "tree": "0048544773ddc9d21706dfcc7307bdd3e2f6971f",
      "parents": [
        "35d22217a5ed2f8b5b9b183217923071ccfe7f37"
      ],
      "author": {
        "name": "Renaud Paquay",
        "email": "rpaquay@google.com",
        "time": "Tue Nov 01 11:23:38 2016 -0700"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon May 29 19:29:30 2017 +0900"
      },
      "message": "Make \"git command\" and \"forall\" work on Windows\n\nPython on Windows does not support non blocking file operations.\nTo workaround this issue, we instead use Threads and a Queue to\nsimulate non-blocking calls. This is happens only when running\nwith the native Windows version of Python, meaning Linux and Cygwin\nare not affected by this change.\n\nChange-Id: I4ce23827b096c5138f67a85c721f58a12279bb6f\n"
    },
    {
      "commit": "a24671f661f1fae6678e2bcdd3c9fbae0ad7100f",
      "tree": "2ba72d9123bf35e8912edc21fb13273c0cd4ba93",
      "parents": [
        "e0684addeeb920ddf83168d5fbbbe50cb9287abd",
        "c79d3b8fd17352cacb975a74f94c878b7d1f5897"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon May 29 04:54:12 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon May 29 04:54:12 2017 +0000"
      },
      "message": "Merge \"init: allow relative path on --reference argument\""
    },
    {
      "commit": "e0684addeeb920ddf83168d5fbbbe50cb9287abd",
      "tree": "03a3dd940950463c0c88062d1fce2aae78708777",
      "parents": [
        "fef9f21b28d3b59804fdd5db2bbb86e797051dab"
      ],
      "author": {
        "name": "David Riley",
        "email": "davidriley@google.com",
        "time": "Wed Apr 05 00:02:59 2017 -0700"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon May 29 13:39:54 2017 +0900"
      },
      "message": "sync: Add support to dump a JSON event log of all sync events.\n\nChange-Id: Id4852968ac1b2bf0093007cf2e5ca951ddab8b3b\n"
    },
    {
      "commit": "c79d3b8fd17352cacb975a74f94c878b7d1f5897",
      "tree": "0cf2224fec644b276df3d1f8b9c6445a0ab74155",
      "parents": [
        "aa90021fbc3382fdac6171572c85ee07369c91e1"
      ],
      "author": {
        "name": "YOUNG HO CHA",
        "email": "ganadist@gmail.com",
        "time": "Tue Jan 24 21:47:50 2017 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Sun May 28 00:33:25 2017 +0000"
      },
      "message": "init: allow relative path on --reference argument\n\nChange-Id: I41d6be6bc035fdddb5a27c072994439986d58d58\nSigned-off-by: YOUNG HO CHA \u003cganadist@gmail.com\u003e\n"
    },
    {
      "commit": "fbcbcabe9879c5af5b9267bcdf30ee8939dfe9b1",
      "tree": "cad44d0577c667f11e2f23432e79cddc54e7a31d",
      "parents": [
        "666debc5180f806cd31fa12b34a072e45f508e1a",
        "e4e94d26ae81dbc9eb6e2f345fac7cd8c533cb9a"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Sat May 27 04:24:58 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Sat May 27 04:24:58 2017 +0000"
      },
      "message": "Merge \"init: add --submodules to sync manifest submodules\""
    },
    {
      "commit": "666debc5180f806cd31fa12b34a072e45f508e1a",
      "tree": "eb122f1e53ec8cef069cc1f5069131be6164cf54",
      "parents": [
        "c354a9b9226831e03a06ef44386937c88c866851"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Fri May 26 21:53:34 2017 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Fri May 26 21:53:34 2017 +0900"
      },
      "message": "gitc_delete: Remove unused imports\n\nChange-Id: I672189ba99e18dca3956e2396c921d1ef0ca2ddd\n"
    },
    {
      "commit": "c354a9b9226831e03a06ef44386937c88c866851",
      "tree": "c33dde025bc44390b8d19981cd436a35e815e3ae",
      "parents": [
        "06848b24150c83d4b1fe2ced328e954391f8a3e5"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Fri May 26 21:52:12 2017 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Fri May 26 21:52:23 2017 +0900"
      },
      "message": "abandon: fix usage of undefined variable\n\nAs reported by pyflakes:\n\n  subcmds/abandon.py:84: undefined name \u0027p\u0027\n\nThe name of the variable should be \u0027proj\u0027.\n\nChange-Id: Ic09eb92e8db6b510e99efce010bd0bb094d7cbfe\n"
    },
    {
      "commit": "e4e94d26ae81dbc9eb6e2f345fac7cd8c533cb9a",
      "tree": "1fe598a2b3e89ae9a56fd640e6cd5b53a8704c7a",
      "parents": [
        "ffb4b890997b1799f188ec44f005d949feb643a7"
      ],
      "author": {
        "name": "Martin Kelly",
        "email": "mkelly@xevo.com",
        "time": "Tue Mar 21 16:05:12 2017 -0700"
      },
      "committer": {
        "name": "Martin Kelly",
        "email": "mkelly@xevo.com",
        "time": "Tue May 23 16:51:31 2017 -0700"
      },
      "message": "init: add --submodules to sync manifest submodules\n\nrepo sync can sync submodules via the --fetch-submodules option.\nHowever, if the manifest repo has submodules, those will not be synced.\nHaving submodules in the manifest repo -- while not commonly done -- can\nbe useful for inheriting a manifest from another project using \u003cinclude\u003e\nand layering changes on top of it.  In this way, you can avoid having to\ndeal with merge conflicts between your own manifests and the other\nproject\u0027s manifests (for example, if you\u0027re managing an Android fork).\n\nAdd a --submodule option to init that automatically syncs the submodules\nin the manifest repo whenever the manifest repo changes.\n\nChange-Id: I45d34f04517774c1462d7f233f482d1d81a332a8\nSigned-off-by: Martin Kelly \u003cmkelly@xevo.com\u003e\n"
    },
    {
      "commit": "ffb4b890997b1799f188ec44f005d949feb643a7",
      "tree": "799140409f36ea5ad1ac57ca72a8eed0085594a7",
      "parents": [
        "04071c1c72437a930db017bd4c562ad06087986a"
      ],
      "author": {
        "name": "Marc Herbert",
        "email": "marc.herbert@intel.com",
        "time": "Tue Apr 04 22:03:53 2017 -0700"
      },
      "committer": {
        "name": "Marc Herbert",
        "email": "marc.herbert@intel.com",
        "time": "Tue Apr 04 22:10:34 2017 -0700"
      },
      "message": "sync.py: report the remote URL on fatal git remote errors\n\nrepo can be configured to download from any number of remote git repos.\nHowever when one fails repo doesn\u0027t report which one. Example:\nFatal: remote error: Daily ls-remote rate limit exceeded for IP xx.xx.xx.xx\n\nTEST\u003drepo init -q -u https://chromium.googlesource.com/chromiumos/manifest.git\n  # Apply patch in ./.repo/repo/\n  # Simulate a git remote error:\n  sed -i -e \u0027s#chromiumos/docs#chromiumos/XXdocs#\u0027 .repo/manifests/full.xml\n  repo sync --quiet --force-sync docs\n  # error message now shows the remote URL\n\nOptional test tip: reduce the time.sleep(random(...)) in ./.repo/repo/project.py\n\nChange-Id: I4509383b6a43a8e66064778e8ed612d8a735c8b6\n"
    },
    {
      "commit": "f4dda9a1be396808fad0cda8316d3a0d6f839ee1",
      "tree": "843fdfada5e3bc60f9c390b3006bd4a1c3448522",
      "parents": [
        "b881d227f3c5ab99c04866723cbc06fed4225e78"
      ],
      "author": {
        "name": "Naseer Ahmed",
        "email": "naseer.ahmed@gmail.com",
        "time": "Thu Dec 01 18:49:54 2016 -0500"
      },
      "committer": {
        "name": "Naseer Ahmed",
        "email": "naseer.ahmed@gmail.com",
        "time": "Thu Dec 01 19:03:41 2016 -0500"
      },
      "message": "init: Add no-tags and current branch options\n\nThis avoids fetching tags and branches for huge manifests\n\nChange-Id: I19c9724d75364440b881b297d42b906f541f73ff\n"
    },
    {
      "commit": "ae81c964b6bef958e3d760e5c51d7d0fa8bf9ff9",
      "tree": "ef237e294e26c13c6189de37763f221b8cc1704a",
      "parents": [
        "e02c17c9eadb7cf591853f97f8780861379ea05f",
        "2e14792a9481736e4b532da64813a7cb856c48a0"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Fri Oct 28 07:52:31 2016 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Oct 28 07:52:31 2016 +0000"
      },
      "message": "Merge \"implement optional \u0027--all\u0027 in the abandon command\""
    },
    {
      "commit": "4d5bb68d58f12885ea06fb73d5e17d8c780c9ff8",
      "tree": "9388a9c030c05bb8780a8bfaa1ff962f2dac1afb",
      "parents": [
        "82f67987a3e665f9c66e8fb944042a1b4815b61b"
      ],
      "author": {
        "name": "Andrew Wheeler",
        "email": "agwheeler@gmail.com",
        "time": "Mon Feb 27 13:52:22 2012 -0600"
      },
      "committer": {
        "name": "Andrew Wheeler",
        "email": "agwheeler@gmail.com",
        "time": "Mon Oct 17 15:24:09 2016 -0500"
      },
      "message": "status: add -q/--quiet option\n\nThe --quiet option reduces the output to just\na list of projects with modified workspaces (and\norphans if -o is specified)\n\nA common use case is when performing a full-workspace\nmerge.  The integrator will kick-off a merge via:\n\n    repo forall -c git merge \u003csome tag\u003e\n\nAnd then produce a short list of conflicted projects via:\n\n    repo status -q\n\nThe integrator can then iteratively fix and clean up all conficted\ncomponents.  The merge is complete when:\n\n    repo status -q\n\n    returns no output.\n\nChange-Id: Ibbba8713eac35befd8287c95948874e23fd5c7e2\n"
    },
    {
      "commit": "2e14792a9481736e4b532da64813a7cb856c48a0",
      "tree": "eb9c9db4514da7032f3a172873ce6dc1247beca0",
      "parents": [
        "699bcd40be2c10e7e55d955e245f0621b8fab110"
      ],
      "author": {
        "name": "Kyunam.jo",
        "email": "kyunam.jo@lge.com",
        "time": "Wed Oct 12 16:33:19 2016 +0900"
      },
      "committer": {
        "name": "Kyunam Jo",
        "email": "kyunam.jo@lge.com",
        "time": "Mon Oct 17 02:29:42 2016 +0000"
      },
      "message": "implement optional \u0027--all\u0027 in the abandon command\n\nwhen you want to delete all local branches, you should be find\nall branches\u0027 name, and type them behind \u0027repo abandon\u0027 command.\n\nUsage:\n    repo abandon --all [\u003cproject\u003e...]\n\nChange-Id: I4d391f37fb9d89b8095488c585468eafc1a35f31\n"
    },
    {
      "commit": "82f67987a3e665f9c66e8fb944042a1b4815b61b",
      "tree": "074458f14fe3d5d245ce62c3f214b22597cf2b80",
      "parents": [
        "699bcd40be2c10e7e55d955e245f0621b8fab110",
        "7f1ccfbb7bb29195e53fcc374a648379f5f53d3a"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon Oct 17 01:10:16 2016 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Oct 17 01:10:16 2016 +0000"
      },
      "message": "Merge \"sync: Fix semaphore release bug that causes thread \u0027leaks\u0027\""
    },
    {
      "commit": "699bcd40be2c10e7e55d955e245f0621b8fab110",
      "tree": "8786606eec17b92304a1e9d4f39f7b041d65fab1",
      "parents": [
        "eceeb1b1f5edb0f42e690bffdf81828abd8ea7fe"
      ],
      "author": {
        "name": "Kyunam.jo",
        "email": "kyunam.jo@lge.com",
        "time": "Wed Oct 12 09:59:34 2016 +0900"
      },
      "committer": {
        "name": "Kyunam.jo",
        "email": "kyunam.jo@lge.com",
        "time": "Wed Oct 12 10:02:30 2016 +0900"
      },
      "message": "Removed duplication code in abandon.py\n\ncode about getting argument is duplicated.\nso this line is removed\n\nChange-Id: Id321b999c7dacdb403cd986cbf35f8db62efc157\n"
    },
    {
      "commit": "7f1ccfbb7bb29195e53fcc374a648379f5f53d3a",
      "tree": "1bd13675e42ba771a5c26343508cfa62831edcfa",
      "parents": [
        "eceeb1b1f5edb0f42e690bffdf81828abd8ea7fe"
      ],
      "author": {
        "name": "Andrew Wheeler",
        "email": "andrew@igmo.org",
        "time": "Fri Jun 17 16:51:07 2016 -0500"
      },
      "committer": {
        "name": "Andrew Wheeler",
        "email": "andrew@igmo.org",
        "time": "Tue Oct 11 14:10:34 2016 -0500"
      },
      "message": "sync: Fix semaphore release bug that causes thread \u0027leaks\u0027\n\nWhen repo syncs a manifest that utilizes multiple branches\nin the same project, then the sync will use an extra\nthread for each \"duplicate\".  For example, if\nthe manifest includes the project \"foo\" and \"bar\"\ntwice, then \"repo sync -jN\" will fetch with N+2 threads.\n\nThis is caused by _FetchHelper() releasing the thread semaphore\nobject each time it\u0027s called, even though _FetchProjectList()\nmay call this function multiple times within the scope of a\nsingle thread.\n\nFix by moving the thread semaphore release to\n_FetchProjectList(), which is only called once per thread\ninstance.\n\nChange-Id: I1da78b145e09524d40457db5ca5c37d315432bd8\n"
    },
    {
      "commit": "eceeb1b1f5edb0f42e690bffdf81828abd8ea7fe",
      "tree": "3fd305d999c46951092958f8f675ba67bdd7816a",
      "parents": [
        "16889ba43da81aead6bdb3acd1233381dd8e7562"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Sun Sep 25 18:24:27 2016 -0700"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Tue Sep 27 03:05:11 2016 +0000"
      },
      "message": "Support broken symlinks when cleaning obsolete paths\n\nWhen there\u0027s a symlink to a directory, os.walk still lists the symlink\nin dirs, even if it isn\u0027t configured to follow symlinks. This will fail\nthe listdirs check if the symlink is broken (either before or during the\ncleanup). So instead, check for directory symlinks and remove them using\nos.remove.\n\nBug: Issue 231\nChange-Id: I0ec45a26be566613a4a39bf694a3d9c6328481c2\n"
    },
    {
      "commit": "4350791e0d652721015cc94509233c833dad8812",
      "tree": "d28ada6016b8c95898a05bc328267a038566129b",
      "parents": [
        "628456833a9be237c7373254fbe0771b2e802a88"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Sep 01 16:26:02 2016 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Sep 20 17:16:12 2016 -0700"
      },
      "message": "On project cleanup, don\u0027t remove nested projects\n\nWhen there are nested projects in a manifest, like on AOSP right now:\n\n\u003cproject path\u003d\"build\" name\u003d\"platform/build\" /\u003e\n\u003cproject path\u003d\"build/blueprint\" name\u003d\"platform/build/blueprint\" /\u003e\n\u003cproject path\u003d\"build/kati\" name\u003d\"platform/build/kati\" /\u003e\n\u003cproject path\u003d\"build/soong\" name\u003d\"platform/build/soong\" /\u003e\n\nAnd the top \"build\" project is removed (or renamed to remove the\nnesting), repo just wipes away everything under build/ and re-creates\nthe projects that are still there. But it only checks to see if the\nbuild/ project is dirty, so if there are dirty files in a nested\nproject, they\u0027ll just be blown away, and a fresh worktree checked out.\n\nInstead, behave similarly to how `git clean -dxf` behaves and preserve\nany subdirectories that have git repositories in them. This isn\u0027t as\nstrict as git -- it does not check to see if the \u0027.git\u0027 entry is a\nreadable gitdir, just whether an entry named \u0027.git\u0027 exists.\n\nIf it encounters any errors removing files, we\u0027ll print them all out to\nstderr and tell the user that we were unable to clean up the obsolete\nproject, that they should clean it up manually, then sync again.\n\nChange-Id: I2f6a7dd205a8e0b7590ca5369e9b0ba21d5a6f77\n"
    },
    {
      "commit": "01b7d758d563ed3eca38cf8b57b7d71f2b6642a3",
      "tree": "f07830c842070251da6fd94a3759050611fe694a",
      "parents": [
        "267ac57361b268e6c3c64390e4803cfee3b85f2f",
        "2ff302929ca12b309ab35a3f957cd0179f382d74"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Sep 14 20:48:24 2016 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Sep 14 20:48:24 2016 +0000"
      },
      "message": "Merge \"When syncing a project with a shared object store, disable automatic pruning.\""
    },
    {
      "commit": "d9de945d8a7842cdb470ee07ee44d692ff5297b5",
      "tree": "840407148d499bec2675249582deb30f27d08140",
      "parents": [
        "e5c0ea0a959e72ddf6ace9c5a75d86de9e7fc1df",
        "163a3be18b92b9deb0a99795fab7b6ca819f1ecc"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Sep 14 05:20:36 2016 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Sep 14 05:20:36 2016 +0000"
      },
      "message": "Merge \"upload: short circuit when nothing is pending\""
    },
    {
      "commit": "2ff302929ca12b309ab35a3f957cd0179f382d74",
      "tree": "64d3150bea0efd2989a22f28e750c09614f9e772",
      "parents": [
        "7a77c16d376f504bd06d017ba10c91e3a6073b08"
      ],
      "author": {
        "name": "Gabe Black",
        "email": "gabeblack@chromium.org",
        "time": "Thu Oct 09 17:54:35 2014 -0700"
      },
      "committer": {
        "name": "Mike Frysinger",
        "email": "vapier@google.com",
        "time": "Wed Sep 14 00:19:44 2016 -0400"
      },
      "message": "When syncing a project with a shared object store, disable automatic pruning.\n\nThe shared object stores confuse git and make it throw away objects which are\nstill in use. We\u0027ll avoid that problem by disabling automatic pruning on those\nprojects, but there\u0027s nothing preventing a user from changing the config back\nor pruning a repository manually.\n\nBUG\u003dchromium:375945\nTEST\u003dRan repo sync on fresh ChromeOS checkout, starting with a branch of repo\nwith this change. Verified that the kernel projects and no others were\nidentified as having shared object stores, and that repo successfully disabled\nautomatic pruning in their configs. Re-enabled pruning and ran repo sync just\non one of the kernel directories. Verified that pruning was re-disabled as a\nresult.\n\nChange-Id: I728ed5b06f0087aeb5a23ba8f5410a7cd10af5b0\n"
    },
    {
      "commit": "e5c0ea0a959e72ddf6ace9c5a75d86de9e7fc1df",
      "tree": "750d5b10252bf5e1dac5f75f7a7de1e2428372d3",
      "parents": [
        "7a77c16d376f504bd06d017ba10c91e3a6073b08"
      ],
      "author": {
        "name": "Vadim Bendebury",
        "email": "vbendeb@chromium.org",
        "time": "Fri Sep 05 10:26:31 2014 -0700"
      },
      "committer": {
        "name": "Mike Frysinger",
        "email": "vapier@google.com",
        "time": "Wed Sep 14 00:17:45 2016 -0400"
      },
      "message": "Consider local project to be default for \u0027repo start\u0027\n\nThe requirement to explicitly specify the local project when starting\na new repo branch is somewhat counter intuitive.\n\nThis patch uses the current directory\u0027s git tree as the default\nproject.\n\nTested by running\n\n  \u0027repo start \u003cname\u003e\u0027\n\nobserved that the result is the same as if running\n\n  \u0027repo start \u003cname\u003e .\u0027\n\nChange-Id: If106caa801b4cd5ba70dbe8354a227d59f100aa3\n"
    },
    {
      "commit": "163a3be18b92b9deb0a99795fab7b6ca819f1ecc",
      "tree": "947ff65483b92eddda1563fc1e46810ee31bf05a",
      "parents": [
        "7a77c16d376f504bd06d017ba10c91e3a6073b08"
      ],
      "author": {
        "name": "Mike Frysinger",
        "email": "vapier@google.com",
        "time": "Mon Apr 04 17:31:32 2016 -0400"
      },
      "committer": {
        "name": "Mike Frysinger",
        "email": "vapier@google.com",
        "time": "Wed Sep 14 00:16:37 2016 -0400"
      },
      "message": "upload: short circuit when nothing is pending\n\nWhen nothing is pending, most of this code is already short-circuited.\nHoist the single check up to make this more obvious/slightly faster.\n\nChange-Id: Iec3a7e08eacd23a7c5f964900d5776bf5252c804\n"
    },
    {
      "commit": "6a0a3648f18342a6cacd0550d8b79384599d64c9",
      "tree": "cafc60ffe24e52f46b184e5ef8ac122f045045c2",
      "parents": [
        "6118faa1185cd49131eb61baf36a3b542ae346ff",
        "9711a98d6c72430491361a6c77206b1a48007064"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Aug 17 04:57:28 2016 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 17 04:57:28 2016 +0000"
      },
      "message": "Merge \"init: Add --no-clone-bundle option\""
    },
    {
      "commit": "6118faa1185cd49131eb61baf36a3b542ae346ff",
      "tree": "5332e11d2b4f368e9303bd32541e0cb722531f4e",
      "parents": [
        "183c52ab0298325c524ed722ef830d823b832569",
        "438eade413b44d3713f020e672ec74a8597efbfe"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Aug 17 04:04:14 2016 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 17 04:04:14 2016 +0000"
      },
      "message": "Merge \"init: Respect --quiet option when synching manifest repository\""
    },
    {
      "commit": "40252c20f75188147558c0135bf71de907e01442",
      "tree": "d20ffbc8160430782680e10ce121b678cdc8e940",
      "parents": [
        "69297c1b771bbbd05b63e965a524de6860d15d8c"
      ],
      "author": {
        "name": "Mike Frysinger",
        "email": "vapier@google.com",
        "time": "Mon Aug 15 21:23:44 2016 -0400"
      },
      "committer": {
        "name": "Mike Frysinger",
        "email": "vapier@google.com",
        "time": "Tue Aug 16 13:02:52 2016 -0400"
      },
      "message": "RepoHook: allow users to approve hooks via manifests\n\nThe constant prompting when registered hooks change can be tedious and\nhas a large multiplication factor when the project is large (e.g. the\nAOSP).  It gets worse as people want to write more checks, hooks, docs,\nand tests (or fix bugs), but every CL that goes in will trigger a new\nprompt to approve.\n\nLet\u0027s tweak our trust model when it comes to hooks.  Since people start\noff by calling `repo init` with a URL to a manifest, and that manifest\ndefines all the hooks, anchor trust in that.  This requires that we get\nthe manifest over a trusted link (e.g. https or ssh) so that it can\u0027t\nbe MITM-ed.  If the user chooses to use an untrusted link (e.g. git or\nhttp), then we\u0027ll fallback to the existing hash based approval.\n\nBug: Issue 226\nChange-Id: I77be9e4397383f264fcdaefb582e345ea4069a13\n"
    },
    {
      "commit": "9711a98d6c72430491361a6c77206b1a48007064",
      "tree": "d8e08c745b76b6a91dfee3857b5714d249ec8f6b",
      "parents": [
        "438eade413b44d3713f020e672ec74a8597efbfe"
      ],
      "author": {
        "name": "Hu xiuyun",
        "email": "xiuyun.hu@hisilicon.com",
        "time": "Fri Dec 11 11:16:41 2015 +0800"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon Aug 15 09:51:48 2016 +0900"
      },
      "message": "init: Add --no-clone-bundle option\n\nBug: Issue 218\nChange-Id: I42ba1f5fb9168875da0df6bdf4fe44c8d6498d54\n"
    },
    {
      "commit": "438eade413b44d3713f020e672ec74a8597efbfe",
      "tree": "91cf69b50b2bb65a7734fec0fb22ac13a09f32d5",
      "parents": [
        "69297c1b771bbbd05b63e965a524de6860d15d8c"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Sun Aug 14 18:02:32 2016 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Mon Aug 15 09:51:48 2016 +0900"
      },
      "message": "init: Respect --quiet option when synching manifest repository\n\nChange-Id: Ib58b7dd971670e0888e6428333050700e776b0de\n"
    },
    {
      "commit": "7ecccf6225586b4215aec098ca3372559593c98f",
      "tree": "377e571c9efb4513c7c3cac0e6f47c1993cbf54e",
      "parents": [
        "cee5c771664833e517f47c0a33e520fd967cbe57"
      ],
      "author": {
        "name": "Sebastian Schuberth",
        "email": "sschuberth@gmail.com",
        "time": "Tue Mar 29 14:11:20 2016 +0200"
      },
      "committer": {
        "name": "Sebastian Schuberth",
        "email": "sschuberth@gmail.com",
        "time": "Thu Apr 21 18:36:11 2016 +0000"
      },
      "message": "diffmanifests: support custom git pretty format strings\n\nChange-Id: I29f4f1351c421f393328514d145df1a96aed9ee2\n"
    },
    {
      "commit": "79fba68e4010f522e3c0e16a099b6176e798ef35",
      "tree": "dd4992df769b7b067c8fd226aece60a774fb9087",
      "parents": [
        "e868841782314e431134c24c350f5a353306fa7d"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Apr 13 18:03:00 2016 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Apr 13 18:03:00 2016 +0900"
      },
      "message": "sync: Update help text for --smart-sync to be more specific\n\nThe --smart-sync option should return the manifest for *the latest*\nknown good build.\n\nChange-Id: I2f3216b5b9e1af2ea5f9c3bf1c025813a3b77581\n"
    },
    {
      "commit": "1f0564406ba5aab11b21a83d193485ee6597f213",
      "tree": "533f5c7a21032a634161c365f781efe8b340ecfc",
      "parents": [
        "936d6185eb9bb802a3b25982bc71c6bc58633f43"
      ],
      "author": {
        "name": "Takeshi Kanemoto",
        "email": "takeshi.kanemoto@sonymobile.com",
        "time": "Tue Jan 26 14:11:35 2016 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Apr 05 07:28:27 2016 +0000"
      },
      "message": "Add --inverse-regex option to forall subcommand\n\nMake it possible to exclude projects using regex/wildcard.\n\nThe syntax is similar to that of the -r option, e.g.:\n\n  repo forall -i ^platform/ ^device/ -c \u0027echo $REPO_PROJECT\u0027\n\nChange-Id: Id250de5665152228c044c79337d3ac15b5696484\n"
    },
    {
      "commit": "4cfb6d7167424ff1a9ffe5319148d62b8d41edb5",
      "tree": "ec38f259d0bcc6592bef4c7fe2cb6b95ad5f73e4",
      "parents": [
        "b29e61133e05a8c500fc4ddd0388bd8447a46372"
      ],
      "author": {
        "name": "Alexandre Garnier",
        "email": "zigarn@gmail.com",
        "time": "Wed Sep 09 15:51:31 2015 +0200"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Feb 18 01:29:54 2016 +0000"
      },
      "message": "Better error display on forall\n\nIt was only displaying \u0027Project list error: GitError()\u0027\nwithout any useful info about the project nor the error\n\nChange-Id: Iad66cbaa03cad1053b5ae9ecc90d7772aa42ac13\n"
    },
    {
      "commit": "ecf0a6c92b62437f2c0a2017a0e98c7f92b162dd",
      "tree": "592a01e04a1ee28923ce8be0a0ffb337fadb695d",
      "parents": [
        "0b4cb325c6f412ac5ab33573b4f5e50b4945c924",
        "04197a5144d6a40ee2d85799b32505250480f365"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Feb 04 22:36:05 2016 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Feb 04 22:36:05 2016 +0000"
      },
      "message": "Merge \"GITC: Fix \u0027repo start \u003cbranch\u003e \u003crepo\u003e/\u003csubdir\u003e\u0027\""
    },
    {
      "commit": "04197a5144d6a40ee2d85799b32505250480f365",
      "tree": "a44651e81b1b56c999e57ccc1c540e841118f76e",
      "parents": [
        "745b4ad660f8050045b521c4e15b7d3ac0b3d70e"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Oct 07 16:53:10 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Feb 04 14:31:55 2016 -0800"
      },
      "message": "GITC: Fix \u0027repo start \u003cbranch\u003e \u003crepo\u003e/\u003csubdir\u003e\u0027\n\nAs soon as we wrote the gitc manifest, the folder for that repo became\nempty, causing the next GetProjects lookup to fail. Reorder the\nGetProjects calls so that they all happen while we still have the\nrepository contents available.\n\nIf you were already in a subdir, for cases like \u0027repo start \u003cbranch\u003e .\u0027,\nthis would still fail, since the working directory would disappear out\nfrom under you. That\u0027s fine most of the time, since we shouldn\u0027t be\ndoing operations based on the local directory, but git has a realpath\nfunction that tries to restore CWD by chdir\u0027ing back to it. So if the\nworking directory no longer exists, chdir to the topdir before\ncontinuing.\n\nChange-Id: Ibdf6cd37ff6e5a5f8338347c3919175491f7166f\n"
    },
    {
      "commit": "0b4cb325c6f412ac5ab33573b4f5e50b4945c924",
      "tree": "c09284588db5cd85958c9270bba63b41b67a15d4",
      "parents": [
        "e9becc079c647f6c9477eed83c0aecb2f591fdf4"
      ],
      "author": {
        "name": "Xiaohui Chen",
        "email": "xiaohuic@google.com",
        "time": "Wed Jan 27 14:33:51 2016 -0800"
      },
      "committer": {
        "name": "Xiaohui Chen",
        "email": "xiaohuic@google.com",
        "time": "Thu Jan 28 10:20:03 2016 -0800"
      },
      "message": "Add option to rebase onto project\u0027s manifest version\n\nSome teams have a continuous build server that would mark certain\nmanifest green and safe to sync to.  Then team members could repo\nsync to that particular manifest file and make sure they always\nsync to a green build.  But if she/he has some local changes and\nwants to rebase, currently it would be a manual process to find the\ncorrect version to rebase onto.  This patch helps with that use\ncase by automating the process to rebase onto the currently synced\nmanifest version.\n\nChange-Id: I847c9eb6addf7f84fd3f5594fbf8c0bcc103f9a5\n"
    },
    {
      "commit": "e9becc079c647f6c9477eed83c0aecb2f591fdf4",
      "tree": "6fc68e16b2bdba169d97a08e17d92ba4892d68ef",
      "parents": [
        "466b8c4ea26f119f2b0532ece764c543e78a873e"
      ],
      "author": {
        "name": "Hu Xiuyun",
        "email": "clouds08@qq.com",
        "time": "Wed Nov 25 15:52:26 2015 +0800"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Nov 26 02:25:43 2015 +0000"
      },
      "message": "Sync: Fix error exit code when both -n and -f are used\n\nWhen repo sync is used with -f (--force-error) and a project fails to\nsync, the sync will continue but then exit with an error status.\n\nHowever if -n (--network-only) is also used, the exit code is 0, even\nwhen a project failed.\n\nModify the logic to make sure the sync exits with the correct status.\n\nBug: Issue 214\nChange-Id: I0b5d97a34642c5aa3743750ef14a42c9d5743c1d\n"
    },
    {
      "commit": "74cfd2709b0bc23fc3efb8951b4b5abb2bf4e4a7",
      "tree": "3df8296e4e9673893cf5fd7ed77b888e606311bf",
      "parents": [
        "c2a64ddffd397f28c1187da1cc07f29825b7d0fb"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Oct 14 10:50:15 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Oct 27 03:04:17 2015 +0000"
      },
      "message": "Sync: Add option to prune refs during sync\n\nBy passing --prune to the sync command, the --prune option is\ngiven to the `git fetch`, causing refs that no longer exist on\nthe remote to be removed.\n\nChange-Id: I3cedacce14276d96ac2d5aabf2d07fd05e92bc02\n"
    },
    {
      "commit": "c2a64ddffd397f28c1187da1cc07f29825b7d0fb",
      "tree": "4232181bf284748fa1934cda2ae15e39d9e7bdcf",
      "parents": [
        "745b4ad660f8050045b521c4e15b7d3ac0b3d70e"
      ],
      "author": {
        "name": "Pascal Muetschard",
        "email": "pmuetschard@google.com",
        "time": "Thu Oct 22 13:26:36 2015 -0700"
      },
      "committer": {
        "name": "Pascal Muetschard",
        "email": "pmuetschard@google.com",
        "time": "Thu Oct 22 13:28:20 2015 -0700"
      },
      "message": "A couple of fixes to the init command\u0027s -p option.\n\nAdds windows as one of the allowed platforms flags.\nFixes -p foo to append \u0027platform-foo\u0027, instead of each letter (list.extend\nexpects a list and thus appends each char in the string, rather than the\nstring itself).\n\nChange-Id: I73a92127ac29a32fc31b335cc54a246302904140\n"
    },
    {
      "commit": "745b4ad660f8050045b521c4e15b7d3ac0b3d70e",
      "tree": "643e836eafdde0c08e1eec540eab6ae23b2ef29e",
      "parents": [
        "4c5f74e4521679d1dcc31c575d417387b9c51c87"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Oct 06 15:23:19 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Oct 07 15:43:22 2015 -0700"
      },
      "message": "Fix gitc-init behavior\n\nWith gitc-init, a gitc client may be specified using \u0027-c\u0027. If we\u0027re\nnot currently in that client, we need to change directories so that\nwe don\u0027t affect the local checkout, and to ensure that repo is\nchecked out in the new client.\n\nThis also makes \u0027-c\u0027 optional if already in a gitc client, to match\nthe rest of the init options.\n\nChange-Id: Ib514ad9fd101698060ae89bb035499800897e9bd\n"
    },
    {
      "commit": "4c5f74e4521679d1dcc31c575d417387b9c51c87",
      "tree": "e19f84c3ff67c767d0aaf488d51376d2cb357996",
      "parents": [
        "b1ad2190a2ef5f9529176075d7b3318e6f39e35c"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Fri Oct 02 11:10:10 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Fri Oct 02 11:12:05 2015 +0900"
      },
      "message": "Sync: Add HTTP Cookie File header on temporary cookie file\n\nThe .gitcookies file generated by googlesource.com does not have\nthe header:\n\n # (Netscape) HTTP Cookie File\n\nwhich causes python\u0027s MozillaCookieJar.load to fail with the\nerror:\n\n \"does not look like a Netscape format cookies file\"\n\nPrepend the expected header onto the generated cookie file.\n\nWe don\u0027t bother to check if the header already exists on the\nfile; repeating it does not cause any problem.\n\nBug: Issue 207\nChange-Id: I7d39720a1d36a6aae00f70691156514ebc04e579\n"
    },
    {
      "commit": "b1ad2190a2ef5f9529176075d7b3318e6f39e35c",
      "tree": "787b8bc1f179ada7a965bffce31a52afedeab401",
      "parents": [
        "f231db11a2f7c2cf28c1228146b0c087c4be882a"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Sep 30 10:35:43 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Fri Oct 02 11:04:01 2015 +0900"
      },
      "message": "Sync: Don\u0027t fail when git cookies can\u0027t be loaded\n\nIf the git cookies file fails to load, use a default\ncookie jar instead.\n\nBug: Issue 207\nChange-Id: I7cb326c204f2784ab4dbd13801b3186667af5b78\n"
    },
    {
      "commit": "f231db11a2f7c2cf28c1228146b0c087c4be882a",
      "tree": "512f2faadd94a83d5cdceec2af44e7c91a83f1f9",
      "parents": [
        "79360640f4c7d5f044973aa1bdb6fb0f8f311f05"
      ],
      "author": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Wed Sep 23 11:38:14 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Oct 01 21:05:17 2015 +0000"
      },
      "message": "GITC: Add repo gitc-delete command.\n\nrepo gitc-delete deletes a GITC client and all the locally\nsaved sources. Useful for removing unnecessary clients and\nrecovering disk space.\n\nChange-Id: Idf23addcea52b8713d268c34a7b37da0c5e5cd26\n"
    },
    {
      "commit": "79360640f4c7d5f044973aa1bdb6fb0f8f311f05",
      "tree": "de0228e9e44b05ad3da07d4e8829a90bebb3871f",
      "parents": [
        "7b01b2fd01f4e37688242db19c93feb27f9b65c6"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Aug 31 15:45:06 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Sep 29 13:46:34 2015 -0700"
      },
      "message": "Add GitcClientCommand class for GITC-specific commands\n\nThese won\u0027t show up as common commands in the help text unless in a GITC\nclient, and will refuse to execute.\n\nChange-Id: Iffe82adcc9d6ddde9cb4b204f83ff018042bdab0\n"
    },
    {
      "commit": "3c0358060786e9a6fcd6b3bbb9c01c887946bdd6",
      "tree": "fb698c2a8b2f52d3029aa00cd754dfec260b00a9",
      "parents": [
        "5ea32d135963da5542b78895f95332c6a17bbe11"
      ],
      "author": {
        "name": "Alexander Bird",
        "email": "Alexander.Bird.42@gmail.com",
        "time": "Fri Sep 11 13:48:10 2015 -0400"
      },
      "committer": {
        "name": "Alexander Bird",
        "email": "alexander.bird.42@gmail.com",
        "time": "Fri Sep 11 14:11:30 2015 -0400"
      },
      "message": "fixed typo in gitc_init.py help output\n\nChange-Id: I86459bf63297487457d6c4c995dfd1e63133ec53\n"
    },
    {
      "commit": "5ea32d135963da5542b78895f95332c6a17bbe11",
      "tree": "832e03decd9f0d7b412b111e00bd28b89c1c9ea6",
      "parents": [
        "5cc384034d144c339d2e5822c36c5ca4529ac487"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Sep 08 13:27:20 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Sep 09 20:50:40 2015 -0700"
      },
      "message": "GITC: Always update the gitc manifest from the repo manifest\n\nThis way any changes made to the main manifest are reflected in the gitc\nmanifest. It\u0027s also necessary to use both manifests to sync since the\ninformation required to update the gitc manifest is actually in the repo\nmanifest.\n\nThis also fixes a few issues that came up when testing. notdefault\ngroups weren\u0027t being saved to the gitc manifest in a method that matched\n\u0027sync\u0027. The merge branch wasn\u0027t always being set to the correct value\neither.\n\nChange-Id: I435235cb5622a048ffad0059affd32ecf71f1f5b\n"
    },
    {
      "commit": "037552333182497e9e38bff984de44df0f93e54b",
      "tree": "4833639da39e34dc4388f06b1eccb541d74589db",
      "parents": [
        "250303b437855c2b50d052a05a08ed517423af8b"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Sep 09 21:43:32 2015 +0000"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Sep 09 21:43:32 2015 +0000"
      },
      "message": "Revert \"GITC: Always update the gitc manifest from the repo manifest\"\n\nThis reverts commit 250303b437855c2b50d052a05a08ed517423af8b.\n\nChange-Id: I1fd8af20f802553151aacb953c913f3305ca6057\n"
    },
    {
      "commit": "250303b437855c2b50d052a05a08ed517423af8b",
      "tree": "ae9df65083e7e0e53d3438adb752cad2dbe27cb5",
      "parents": [
        "ba72d8301e33344b3b11e286619c99568c37db1a"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Sep 08 13:27:20 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Sep 09 12:35:56 2015 -0700"
      },
      "message": "GITC: Always update the gitc manifest from the repo manifest\n\nThis way any changes made to the main manifest are reflected in the gitc\nmanifest. It\u0027s also necessary to use both manifests to sync since the\ninformation required to update the gitc manifest is actually in the repo\nmanifest.\n\nThis also fixes a few issues that came up when testing. notdefault\ngroups weren\u0027t being saved to the gitc manifest in a method that matched\n\u0027sync\u0027. The merge branch wasn\u0027t always being set to the correct value\neither.\n\nChange-Id: I5dbc850dd73a9fbd10ab2470ae4c40e46ff894de\n"
    },
    {
      "commit": "ba72d8301e33344b3b11e286619c99568c37db1a",
      "tree": "4833639da39e34dc4388f06b1eccb541d74589db",
      "parents": [
        "9ff2ece6abc5d0d4a69c2f086209f107fd4f04be"
      ],
      "author": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Thu Sep 03 10:47:44 2015 -0700"
      },
      "committer": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Thu Sep 03 10:47:44 2015 -0700"
      },
      "message": "GITC: Fix repo sync.\n\nFixing http://b/23785024 by calling os.getcwd() because variable\ncwd no longer exists.\n\nChange-Id: I21ff7d059e072f9f60726db76b67587a92c878ad\n"
    },
    {
      "commit": "9ff2ece6abc5d0d4a69c2f086209f107fd4f04be",
      "tree": "1daabfe078e59b38ba0a1fdf9f6b0c83bcf7eba9",
      "parents": [
        "2487cb7b2c41506c8ef900dba735876b01c67eab"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Aug 31 15:45:06 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Sep 01 12:23:56 2015 -0700"
      },
      "message": "gitc: Improve help visibility\n\nThis improves the visiblity of gitc-init if we can get the gitc config,\nand hides it otherwise.\n\nChange-Id: I82830b0b07c311e8c74397ba79eb4c361f8b6fb5\n"
    },
    {
      "commit": "8ce5041596ef486510245946b7c6c68ec59add29",
      "tree": "77ba4fc3346af1f6a54d4018eae12d719671b532",
      "parents": [
        "f7a51898d3c989321c29f4ebaf7c3e9d106bc509"
      ],
      "author": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Fri Aug 28 14:25:44 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Aug 31 21:39:17 2015 +0000"
      },
      "message": "GITC: Pull GITC Manifest Dir from the config.\n\nUpdates the repo launcher and gitc_utils to pull the manifest\ndirectory location out of the gitc config file.\n\nChange-Id: Id08381b8a7d61962093d5cddcb3ff6afbb13004b\n"
    },
    {
      "commit": "f7a51898d3c989321c29f4ebaf7c3e9d106bc509",
      "tree": "600309dc1799351b36a9cc588c27b8856a808f6a",
      "parents": [
        "b9a1b73425773dc97843f92aeee9c57c9a08c0f7"
      ],
      "author": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Thu Aug 27 11:44:42 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Aug 28 18:09:05 2015 +0000"
      },
      "message": "GITC: Expand relative remote URLs.\n\nThe GITC filesystem does not understand relative URLs for remotes,\nso now if a remote uses a relative URL, it will be be expanded to\nbe relative to the manifest URL.\n\nChange-Id: Ie1210758560aeb1934da3f71496aaf19c2728214\n"
    },
    {
      "commit": "b9a1b73425773dc97843f92aeee9c57c9a08c0f7",
      "tree": "592a3655e92af8c7265ba07e29ba35aa1a1a36a8",
      "parents": [
        "dc2545cad60d7e8bae894f5d60eaeb3cff7485ae"
      ],
      "author": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Thu Aug 20 12:19:28 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Aug 28 10:53:05 2015 -0700"
      },
      "message": "GITC: Add repo start support.\n\nAdd repo start support for GITC checkouts. If the user is in\nthe GITC FS view, they can now run repo start to check out\nthe sources and create a new working branch.\n\nWhen \"repo start\" is called on a GITC project, the revision\ntag is set to an empty string and saved in a new tag:\nold-revision. This tells the GITC filesystem to display the\nlocal copy of the sources when being viewed. The local copy\nis created by pulling the project sources and the new branch\nis created based off the original project revision.\n\nUpdated main.py to setup each command\u0027s gitc_manifest when\nappropriate.\n\nUpdated repo sync\u0027s logic to sync opened projects and\nupdating the GITC manifest file for the rest.\n\nChange-Id: I7e4809d1c4fc43c69b26f2f1bebe45aab0cae628\n"
    },
    {
      "commit": "3010e5ba646f938a856fc286439a3df34ed9a53f",
      "tree": "24ae4bcff8eb49c0e4a046664262bed5cfe3e6df",
      "parents": [
        "ba7bc738c1044b68574a28423751156003400362"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Aug 20 10:09:20 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Aug 20 10:29:37 2015 -0700"
      },
      "message": "Smartsync: Don\u0027t fail if there isn\u0027t a cookiefile\n\nChange-Id: I434a259f43ca9808e88051ac8ba865c519a24702\n"
    },
    {
      "commit": "ba7bc738c1044b68574a28423751156003400362",
      "tree": "b79f78944b488436f09490ac2ef4f40c227e250a",
      "parents": [
        "f4599a2a3de5025088e4248ea47f62d5edba24fd"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Aug 20 16:55:42 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Aug 20 17:05:17 2015 +0900"
      },
      "message": "Sync: Refactor netrc parsing\n\nDon\u0027t emit a message when the netrc file doesn\u0027t exist or couldn\u0027t\nbe opened.\n\nInstead of trying to unpack the result of info.authenticators() and\ncatching the resulting TypeError when it\u0027s None, first store it to\na local and only unpack it if it has a value.\n\nAlso remove an unused import.\n\nChange-Id: I5c404d91e48c261c1ab850c3e5f040c4f4c235cb\n"
    },
    {
      "commit": "f4599a2a3de5025088e4248ea47f62d5edba24fd",
      "tree": "6090440db55a6c10395ace33c8791a218c12154e",
      "parents": [
        "022a1d4e6ec574d6b21febde8d2088393f42c5fb"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Aug 20 16:45:39 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Aug 20 16:45:39 2015 +0900"
      },
      "message": "gitc_init: Remove unused import\n\nAlso add missing newline at the end of the file.\n\nChange-Id: I206e6c4b033d223eb0ff5824ecbf6fd98c39c918\n"
    },
    {
      "commit": "7c9263bce09725227dc518ee298b350becbdf26e",
      "tree": "c2547dbfca738c2da6763fb5fe59195f4ee10658",
      "parents": [
        "dab9e99f0f6d4f82e0e61b37396f7c0915a8d508",
        "0745bb26571e0cf097baebd48761b8cd743ec7fc"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Aug 19 23:36:35 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 19 23:36:35 2015 +0000"
      },
      "message": "Merge \"Support smart-sync through persistent-http[s]\""
    },
    {
      "commit": "0745bb26571e0cf097baebd48761b8cd743ec7fc",
      "tree": "b8d83d1ec06cd3d430dfc2f5447276e38e2f86f7",
      "parents": [
        "5d0c3a614edc3f3d5967cfc07c7981da7013ea91"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Aug 17 13:41:45 2015 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Aug 19 10:22:11 2015 -0700"
      },
      "message": "Support smart-sync through persistent-http[s]\n\nUse the same cookies and proxy that git traffic goes through for\npersistent-http[s] to support authentication for smart-sync.\n\nChange-Id: I20f4a281c259053a5a4fdbc48b1bca48e781c692\n"
    },
    {
      "commit": "bdb5271de3fafb9fbec3fde0e8e95e5b061ab0f5",
      "tree": "73e247db933aebfce5a63dbce6a1966c09cef3e0",
      "parents": [
        "5d0c3a614edc3f3d5967cfc07c7981da7013ea91"
      ],
      "author": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Mon Aug 10 13:23:23 2015 -0700"
      },
      "committer": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Tue Aug 18 11:59:10 2015 -0700"
      },
      "message": "GITC: Add repo sync support.\n\nAdd repo sync support for GITC checkouts. If the user is in the\nGITC client directory they can still pull the sources as normal\nif they pass in the --force-gitc argument. Otherwise the user\nshould call repo sync in the GITC view to update the user\u0027s\nremote view. (This works because .repo in the GITC view will\nlink to .repo in the client config directory.)\n\nPart of the support for this change is the refactoring of GITC\nrelated code into gitc_utils.py.\n\nChange-Id: I2636aaa50b450b6f091309db8dd0e8f4dbdad579\n"
    },
    {
      "commit": "5d0c3a614edc3f3d5967cfc07c7981da7013ea91",
      "tree": "8429fdb99432ff237a45a79d7ae126ad8098fa6c",
      "parents": [
        "2635c0e3b6d0fb7a48d892fe9528197eb13bc98b",
        "1efc2b4a0157b5c23317e5e7a51643016133cff5"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Aug 12 23:25:20 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 12 23:25:20 2015 +0000"
      },
      "message": "Merge \"GITC: Add gitc-init subcommand to repo.\""
    },
    {
      "commit": "1efc2b4a0157b5c23317e5e7a51643016133cff5",
      "tree": "e1d51a6b93948da37f888adf89206c658193f2d5",
      "parents": [
        "abaa7f312f1b6c8d11d7c757fe909900ce5788b5"
      ],
      "author": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Wed Aug 05 15:04:22 2015 -0700"
      },
      "committer": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Wed Aug 12 16:22:14 2015 -0700"
      },
      "message": "GITC: Add gitc-init subcommand to repo.\n\nAdds the new gitc-init command to set up a GITC client. Gitc-init\nsets up the client directory and calls repo init within it. Once\nthe repo is initialized, then generates a GITC manifest file\nby using git ls-remote on each project and retrieving the HEAD SHA\nto use as the revision attribute.\n\nGitc-init inherits from and has all the options as repo init.\n\nChange-Id: Icd7e47e90eab752a77de7c80ebc98cfe16bf6de3\n"
    },
    {
      "commit": "43322283dc97b12e6d5b03c27fb780b0110f889a",
      "tree": "d34bfa5366fffa045f8d82158b19a5add4c588b9",
      "parents": [
        "7e59de2bcc8513ba28701062be2637d90cb6eeff",
        "0369a069ade1602879c16dd33dc592bed3f17c0f"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Aug 05 01:01:02 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 05 01:01:02 2015 +0000"
      },
      "message": "Merge \"Support filtering by group on forall and list subcmd\""
    },
    {
      "commit": "555be547903a3077de8fa4e0d3dfd3d9202ddc10",
      "tree": "d5ba08eeee80b766acab489be275071cc3648d07",
      "parents": [
        "abaa7f312f1b6c8d11d7c757fe909900ce5788b5",
        "c5cd433daf310694d1435fe30e22e1ad2217b1ab"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Fri Jul 31 17:06:23 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Jul 31 17:06:23 2015 +0000"
      },
      "message": "Merge \"Emit project info in case of sync exception.\""
    },
    {
      "commit": "c5cd433daf310694d1435fe30e22e1ad2217b1ab",
      "tree": "4d0901ab306c62ce6394f290249445cbd0548d08",
      "parents": [
        "53e902a19b0b80e07ac55966d13c5c84c5b0e8ce"
      ],
      "author": {
        "name": "Dan Sandler",
        "email": "dsandler@android.com",
        "time": "Fri Jul 31 09:37:53 2015 -0400"
      },
      "committer": {
        "name": "Dan Sandler",
        "email": "dsandler@google.com",
        "time": "Fri Jul 31 14:03:50 2015 +0000"
      },
      "message": "Emit project info in case of sync exception.\n\nPreviously repo would only print the failing project path if\nSync_NetworkHalf returned false/empty, but if it threw an\nexception the print() was never called.\n\nChange-Id: I58c41de43930df5e34b21561c205e062a72e290f\n"
    },
    {
      "commit": "0369a069ade1602879c16dd33dc592bed3f17c0f",
      "tree": "96d4f4970bc5d0b3ba7fcdca5946e47e170ff2bc",
      "parents": [
        "abaa7f312f1b6c8d11d7c757fe909900ce5788b5"
      ],
      "author": {
        "name": "Graham Christensen",
        "email": "graham@grahamc.com",
        "time": "Wed Jul 29 17:02:54 2015 -0500"
      },
      "committer": {
        "name": "Graham Christensen",
        "email": "graham@grahamc.com",
        "time": "Thu Jul 30 12:59:35 2015 -0500"
      },
      "message": "Support filtering by group on forall and list subcmd\n\nEnable operating against groups of repositories. As it stands, it isn\u0027t\ncompatible with `-r/--regex`.\n\n`repo forall -g groupname -c pwd` will  run `pwd` for all projects in\ngroupname.\n\n`repo forall -g thisgroup,-butnotthisone -c pwd` will  run `pwd` for all\nprojects in `thisgroup` but not `butnotthisone`.\n\n`repo list -g groupname -n` will list all the names of repos in\n`groupname`.\n\nChange-Id: Ia75c50ce52541d1c8cea2874b20a4db2e0e54960\n"
    },
    {
      "commit": "abaa7f312f1b6c8d11d7c757fe909900ce5788b5",
      "tree": "2eba7244f267c9df33510a820b5353da1d7722cd",
      "parents": [
        "7cccfb2cf0ed1ed14f6b8a5bdb36459ebcb4db5a"
      ],
      "author": {
        "name": "Kevin Degi",
        "email": "kdegi@codeaurora.org",
        "time": "Wed Nov 12 11:27:45 2014 -0700"
      },
      "committer": {
        "name": "Kevin Degi",
        "email": "kdegi@codeaurora.org",
        "time": "Wed Jul 29 14:44:46 2015 -0600"
      },
      "message": "Add option to correct gitdir when syncing\n\nIn some cases, a user may wish to continue with a sync even though\nit would require overwriting an existing git directory. This behavior\nis not safe as a default because it could result in the loss of some\nuser data, but as an optional flag it allows the user more flexibility.\n\nTo support this, add a --force-sync flag to the sync command that will\nattempt to overwrite the existing git dir if it is specified and the\nexisting git dir points to the wrong obj dir.\n\nChange-Id: Ieddda8ad54e264a1eb4a9d54881dd6ebc8a03833\n"
    },
    {
      "commit": "57f43f49448a9eb255eb2452e902d3f26e77aca3",
      "tree": "cb7b72228ea340463e3471c59b59e8b570112006",
      "parents": [
        "4e16c249817aa3b14a5d1ce767687f1d82c41249",
        "17af578d72e89016fa94d4dc97d58ceaa4a7c531"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Jul 29 02:11:55 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Jul 29 02:11:55 2015 +0000"
      },
      "message": "Merge \"Prevent repo info from crashing when default element doesn\u0027t exist.\""
    },
    {
      "commit": "17af578d72e89016fa94d4dc97d58ceaa4a7c531",
      "tree": "7d909c1477586149b3a24ffe5f50eb31cc20c420",
      "parents": [
        "c5ceeb16258d5d787845840036c57f9fdfdcad34"
      ],
      "author": {
        "name": "Cassidy Burden",
        "email": "cburden@codeaurora.org",
        "time": "Mon Jun 29 14:51:35 2015 -0700"
      },
      "committer": {
        "name": "Cassidy Burden",
        "email": "cburden@codeaurora.org",
        "time": "Mon Jul 27 16:56:31 2015 -0700"
      },
      "message": "Prevent repo info from crashing when default element doesn\u0027t exist.\n\nrepo info will crash when using a manifest with no default element despite\ndefault being an optional element. Output nothing for \"Manifest Branch\" if no\ndefault element exists (or if no default revision exists).\n\nChange-Id: I7ebffa2408863837ba980f0ab6e593134400aea9\n"
    },
    {
      "commit": "6944cdb8d1b4765b4e9e6b3f3a09b65495da7ff3",
      "tree": "e911b1fb2196cf9c3bbe3ad9658d613db9dd6452",
      "parents": [
        "59b417493e0b0a18ba11f9d214308e82872c38e6"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu May 07 14:39:44 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Mon Jul 06 16:18:06 2015 +0900"
      },
      "message": "forall: use smart sync override manifest if it exists\n\nIf a workspace is synced with the -s or -t option, the included projects\nmay be different to those in the original manifest. However, when using\nthe forall command, the list of the projects from the original manifest\nis used.\n\nIf the smart sync manifest file exists, use it to override the original\nmanifest.\n\nChange-Id: Iaefcbe148d2158ac046f158d98bbd8b5a5378ce7\n"
    },
    {
      "commit": "59b417493e0b0a18ba11f9d214308e82872c38e6",
      "tree": "fce1b823a59a6870dcd813aa6a167a30c6b5bcbb",
      "parents": [
        "30d13eea862bdc9df1b0bcd32318f24250dd96ea"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu May 07 14:36:09 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Mon Jul 06 16:18:06 2015 +0900"
      },
      "message": "sync: Remove smart sync override manifest when not in smart sync mode\n\nWhen syncing with the -s or -t option, a smart_sync_override.xml file\nis created. This file is left in the file system when syncing again\nwithout the -s or -t option.\n\nRemove the smart sync override manifest, if it exists, when not using\nthe -s or -t option.\n\nChange-Id: I697a0f6405205ba5f84a4d470becf7cd23c07b4b\n"
    },
    {
      "commit": "30d13eea862bdc9df1b0bcd32318f24250dd96ea",
      "tree": "0013a0160ef6a57eb474cf746d0f8466133ddf40",
      "parents": [
        "727cc3e32424886b90df2094063549189cbbb390"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu May 07 15:01:15 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Mon Jul 06 16:18:06 2015 +0900"
      },
      "message": "forall: Don\u0027t try to get lrev of projects in mirror workspace\n\ngit rev-parse fails for projects that don\u0027t have an explicit revision\nspecified, and don\u0027t have a branch of the same name as the default\nrevision. This can be the case in a workspace synced with the smart\nsync (-s) or smart tag (-t) option.\n\nChange-Id: I19bfe9fe7396170379415d85f10f6440dc6ea08f\n"
    },
    {
      "commit": "727cc3e32424886b90df2094063549189cbbb390",
      "tree": "59247c708be1db7c94f8a5ba6196d9a823d96cf8",
      "parents": [
        "c5ceeb16258d5d787845840036c57f9fdfdcad34"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu May 07 14:16:49 2015 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Mon Jul 06 16:18:06 2015 +0900"
      },
      "message": "sync: Improve error message when writing smart sync manifest fails\n\nThe error message only states that writing the manifest failed.\n\nInclude the exception message, so it\u0027s easier to track down the reason\nthat the write failed.\n\nChange-Id: I06e942c48a19521ba45292199519dd0a8bdb1de7\n"
    },
    {
      "commit": "c5ceeb16258d5d787845840036c57f9fdfdcad34",
      "tree": "613698381def3d70986cef771ba6226003845a75",
      "parents": [
        "185307d1dd1e63a8cf139c55f26895a6b378d43b",
        "db75704bfc12546bfbce96aea0be5c283df18314"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Jun 25 14:53:46 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Jun 25 14:53:46 2015 +0000"
      },
      "message": "Merge \"Fix \u0027repo cherry-pick\u0027 to avoid hanging on commit-msg update.\""
    },
    {
      "commit": "db75704bfc12546bfbce96aea0be5c283df18314",
      "tree": "5944a458effaa5f8f7297176d2667d87db1b8c67",
      "parents": [
        "35de228f331101ba17bbc658c3cd910e54725517"
      ],
      "author": {
        "name": "Than McIntosh",
        "email": "thanm@google.com",
        "time": "Mon Jun 01 11:17:13 2015 -0400"
      },
      "committer": {
        "name": "Than McIntosh",
        "email": "thanm@google.com",
        "time": "Mon Jun 22 08:00:20 2015 -0400"
      },
      "message": "Fix \u0027repo cherry-pick\u0027 to avoid hanging on commit-msg update.\n\nAfter performing the actual cherry-pick operation, the code\nin cherry_pick.py opens a pipe to \u0027git commit -F\u0027 to rewrite the commit\nmessage, emits the fixed-up commit msg to the pipe, then waits\nfor \u0027git commit\u0027 to complete. The child \u0027git\u0027 process winds up\nhanging while reading from the pipe, however, since the parent\nprocess still has it open. To fix the hang, change the parent process\nto close its end of the pipe after it has emitted the message.\n\nChange-Id: I5929371e69a5b076f09009d00d40a2c72ac8ac33\n"
    },
    {
      "commit": "c116f94261cf0e6d33b3910b68d08d3b0e4bccdd",
      "tree": "ceef154d627d37f33eed5e945c58133263a95ebd",
      "parents": [
        "7993f3cdda0c66d97aae5c4570921130023e6048"
      ],
      "author": {
        "name": "Anthony King",
        "email": "anthonydking@slimroms.net",
        "time": "Wed Jun 03 17:29:29 2015 +0100"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Jun 04 00:34:19 2015 +0000"
      },
      "message": "forall: setenv, only encode val if encode exists\n\nChange-Id: I655e3043d0118c4e929897d3a51e5e013e5758dc\n"
    },
    {
      "commit": "7993f3cdda0c66d97aae5c4570921130023e6048",
      "tree": "80bf292fbb28bb219c684087a8a5512731748aeb",
      "parents": [
        "b1d1fd778d5d3d3217023df8b428c5b7fa22a337"
      ],
      "author": {
        "name": "Anthony King",
        "email": "anthonydking@slimroms.net",
        "time": "Wed Jun 03 17:21:56 2015 +0100"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Jun 04 00:33:33 2015 +0000"
      },
      "message": "init: don\u0027t call urllib.parse\n\nit\u0027s actually urllib.parse.urlparse\n\nChange-Id: Ie3532e54625e887c8682d92b932ea21a629e8d60\n"
    },
    {
      "commit": "31a7be561ef34c134447d92a3d391b17ecd7c790",
      "tree": "afaefd046551596817595c4dbd10534461cc0d7d",
      "parents": [
        "35de228f331101ba17bbc658c3cd910e54725517"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed May 13 00:04:36 2015 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed May 13 11:09:38 2015 -0700"
      },
      "message": "Catch exceptions in project list generator\n\nIf the generator that produces per-project worker arguments raises an\nexception it triggers python bug http://bugs.python.org/issue8296.\nRewrite the generator expression as a generator function, and catch\nExceptions and KeyboardInterrupts to end the iteration.\n\nAlso add a pool worker initializer to disable SIGINT to prevent\nKeyboardInterrupts inside multiprocessing.Pool in the worker threads\ncausing the same problem.\n\nFixes easy-to-reproduce hangs when hitting ctrl-c during\nrepo forall -c echo\n\nChange-Id: Ie4a65b3e1e07a64ed6bb6ff20f3912c4326718ca\n"
    },
    {
      "commit": "b155354034a7ac18d83ab28cc3756dc36591435f",
      "tree": "f273424f6b01482197113508d11a841f75818f57",
      "parents": [
        "4ccad7554b958c701653c41a72442cccf301e71a"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Sep 04 21:28:09 2014 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Apr 30 14:29:02 2015 +0000"
      },
      "message": "Add option on sync to avoid fetching from remotes for existing sha1\n\nIn 2fb6466f795eb30c1dfa598501f5b5d2981e6a5f an optimisation was\nadded to avoid fetching from remotes if the project is fixed to\na revision and the revision is already available locally.\n\nThis causes problems for users who expect all objects to be\nfetched by default.\n\nChange the logic so that the optimized behaviour is only enabled if\nan option is explicitly given to repo sync.\n\nChange-Id: I3b2794ddd8e0071b1787e166463cd8347ca9e24f\n"
    },
    {
      "commit": "a38769cda88fce2e96c02021060a4c7d2cb96cc8",
      "tree": "9f437217354bcfbd9df1c06e6566c6a04a34c70b",
      "parents": [
        "44859d02672be7509b8fe9b2d444aa239a849af5",
        "6ad6dbefe79196f0d7bb717fa9279837083e9113"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Wed Apr 08 17:59:56 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Apr 08 17:59:58 2015 +0000"
      },
      "message": "Merge \"forall: use a generator to map the Pool\""
    }
  ],
  "next": "6ad6dbefe79196f0d7bb717fa9279837083e9113"
}
