)]}'
{
  "log": [
    {
      "commit": "b2bd91c99b9435cf950ecf8efbb8439f31d3fcbc",
      "tree": "5d26d3943317c11c1cd913fc5640074a5bc7910b",
      "parents": [
        "3f5ea0b18207a81f58595b1a2e10e5ffb784b74f"
      ],
      "author": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Wed Jan 11 11:28:42 2012 +0800"
      },
      "committer": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Mon Nov 19 10:45:21 2012 -0800"
      },
      "message": "Represent git-submodule as nested projects, take 2\n\n(Previous submission of this change broke Android buildbot due to\n incorrect regular expression for parsing git-config output.  During\n investigation, we also found that Android, which pulls Chromium, has a\n workaround for Chromium\u0027s submodules; its manifest includes Chromium\u0027s\n submodules.  This new change, in addition to fixing the regex, also\n take this type of workarounds into consideration; it adds a new\n attribute that makes repo not fetch submodules unless submodules have a\n project element defined in the manifest, or this attribute is\n overridden by a parent project element or by the default element.)\n\nWe need a representation of git-submodule in repo; otherwise repo will\nnot sync submodules, and leave workspace in a broken state.  Of course\nthis will not be a problem if all projects are owned by the owner of the\nmanifest file, who may simply choose not to use git-submodule in all\nprojects.  However, this is not possible in practice because manifest\nfile owner is unlikely to own all upstream projects.\n\nAs git submodules are simply git repositories, it is natural to treat\nthem as plain repo projects that live inside a repo project.  That is,\nwe could use recursively declared projects to denote the is-submodule\nrelation of git repositories.\n\nThe behavior of repo remains the same to projects that do not have a\nsub-project within.  As for parent projects, repo fetches them and their\nsub-projects as normal projects, and then checks out subprojects at the\ncommit specified in parent\u0027s commit object.  The sub-project is fetched\nat a path relative to parent project\u0027s working directory; so the path\nspecified in manifest file should match that of .gitmodules file.\n\nIf a submodule is not registered in repo manifest, repo will derive its\nproperties from itself and its parent project, which might not always be\ncorrect.  In such cases, the subproject is called a derived subproject.\n\nTo a user, a sub-project is merely a git-submodule; so all tips of\nworking with a git-submodule apply here, too.  For example, you should\nnot run `repo sync` in a parent repository if its submodule is dirty.\n\nChange-Id: I4b8344c1b9ccad2f58ad304573133e5d52e1faef\n"
    },
    {
      "commit": "75ee0570da09abb1d2bbefe0d25f0560727e6b71",
      "tree": "c62ab4990212282d9c18c694ec21830ad33481f2",
      "parents": [
        "88b86728a4451b97a2c6dcae2feb98014c077793"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Nov 15 17:33:11 2012 -0800"
      },
      "committer": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Nov 15 18:50:11 2012 -0800"
      },
      "message": "Raise a NoManifestException when the manifest DNE\n\nWhen a command (eg, `repo forall`) expects the manifest project to\nexist, but there is no manifest, an IOException gets raised.  This\nchange defines a new Exception type to be raised in these cases and\nraises it when project.py fails to read the manifest.\n\nChange-Id: Iac576c293a37f7d8f60cd4f6aa95b2c97f9e7957\n"
    },
    {
      "commit": "8f62fb7bd305337994bced7d23b347d0d39f5faf",
      "tree": "7a00915a4e6138fe2c12d6f8d181b623df8962a2",
      "parents": [
        "c1b86a232383748811c6faf17f364e63e10f7dd4"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 12:09:38 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 12:09:38 2012 +0900"
      },
      "message": "Tidy up code formatting a bit more\n\nEnable the following Pylint warnings:\n\n  C0322: Operator not preceded by a space\n  C0323: Operator not followed by a space\n  C0324: Comma not followed by a space\n\nAnd make the necessary fixes.\n\nChange-Id: I74d74283ad5138cbaf28d492b18614eb355ff9fe\n"
    },
    {
      "commit": "c1b86a232383748811c6faf17f364e63e10f7dd4",
      "tree": "8f28c8e8a922ffd4165f48a1988500070936bd39",
      "parents": [
        "98ffba1401056e2d88d3f3898b6fbf5d7d3931a4"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 11:36:51 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 11:38:57 2012 +0900"
      },
      "message": "Fix inconsistent indentation\n\nThe repo coding style is to indent at 2 characters, but there are\nmany places where this is not followed.\n\nEnable pylint warning \"W0311: Bad indentation\" and make sure all\nindentation is at multiples of 2 characters.\n\nChange-Id: I68f0f64470789ce2429ab11104d15d380a63e6a8\n"
    },
    {
      "commit": "98ffba1401056e2d88d3f3898b6fbf5d7d3931a4",
      "tree": "7a39e4d55327bd186b66baf91e9cfed3d8a80c66",
      "parents": [
        "cecd1d864fc3cf02cf50d367111e0d0e173c5dc6"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 11:18:00 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 11:38:57 2012 +0900"
      },
      "message": "Fix: \"Statement seems to have no effect\"\n\nPylint raises an error on the call:\n\n  print\n\nChange it to:\n\n print()\n\nChange-Id: I507e1b3dd928fa6c32ea7e86260fb3d7b1428e6f\n"
    },
    {
      "commit": "cecd1d864fc3cf02cf50d367111e0d0e173c5dc6",
      "tree": "b4f660400560dce21cd7a00ffe5a5d74b54bcb81",
      "parents": [
        "fc241240d828d7e8302dc0876608a9d27ae1cbc7"
      ],
      "author": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Thu Nov 01 22:59:27 2012 -0700"
      },
      "committer": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Tue Nov 13 17:33:56 2012 -0800"
      },
      "message": "Change print statements to work in python3\n\nThis is part of a series of changes to introduce Python3 support.\n\nChange-Id: I373be5de7141aa127d7debdbce1df39148dbec32\n"
    },
    {
      "commit": "7e6dd2dff012062b8dd812f923339790323b3840",
      "tree": "0ca1a9e444eb7ebfa40d79ade53939da187da791",
      "parents": [
        "e072a92a9bb9fdf61bbd1df4e8864f8fd52d5a82"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Oct 25 12:40:51 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 07 08:39:57 2012 +0900"
      },
      "message": "Fix pylint warning W0108: Lambda may not be necessary\n\nRemove unnecessary usage of lambda.\n\nChange-Id: I06d41933057d60d15d307ee800cca052a44754c6\n"
    },
    {
      "commit": "b42b4746af736cdc4e9309c150ec3bff704d19d3",
      "tree": "bda62589c57f591aa68b0c8d98fea5c5941a1c22",
      "parents": [
        "e21526754be58523c673d29731ee01d80e0ffc31"
      ],
      "author": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Wed Oct 31 12:27:27 2012 -0700"
      },
      "committer": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Wed Oct 31 12:27:27 2012 -0700"
      },
      "message": "project: Require git \u003e\u003d 1.7.2 for setting config on command line\n\nThis option causes the git call to fail, which probably indicates a\nprogramming error; callers should check the git version and change the\ncall appropriately if -c is not available. Failing loudly is preferable\nto failing silently in the general case.\n\nFor an example of correctly checking at the call site, see I8fd313dd.\nIf callers prefer to fail silently, they may set GIT_CONFIG_PARAMETERS\nin the environment rather than using the config kwarg to pass\nconfiguration.\n\nChange-Id: I0de18153d44d3225cd3031e6ead54461430ed334\n"
    },
    {
      "commit": "1d947b30342163b723c96db563967323535fef45",
      "tree": "b6b02d02df01792b356b9e50ceeaadcaf3a2e8c5",
      "parents": [
        "2d113f35460051823ea54d61c5c939565518f969"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Oct 25 12:23:11 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Oct 30 10:28:20 2012 +0900"
      },
      "message": "Even more coding style cleanup\n\nFixing some more pylint warnings:\n\nW1401: Anomalous backslash in string\nW0623: Redefining name \u0027name\u0027 from outer scope\nW0702: No exception type(s) specified\nE0102: name: function already defined line n\n\nChange-Id: I5afcdb4771ce210390a79981937806e30900a93c\n"
    },
    {
      "commit": "cd81dd6403fc8dbe6ec5920c517d9083902c3c1f",
      "tree": "935f3f82d2eb32c06b812f66d56d138074309ef8",
      "parents": [
        "80d2ceb22267b7dc61b107934ff5264b6439a785"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 26 12:18:00 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 26 12:24:57 2012 -0700"
      },
      "message": "Revert \"Represent git-submodule as nested projects\"\n\nThis reverts commit 69998b0c6ff724bf620480140ccce648fec7d6a9.\nBroke Android\u0027s non-gitmodule use case.\n\nConflicts:\n\tproject.py\n\tsubcmds/sync.py\n\nChange-Id: I68ceeb63d8ee3b939f85a64736bdc81dfa352aed\n"
    },
    {
      "commit": "dc96476af37558c8eaf6d25087d4a604612642dd",
      "tree": "dfdfde22a3ba610bdba5764a184ada1c3996e23e",
      "parents": [
        "2577cec0952899040cd8c6523f69ece4cdc005ac",
        "091f893625269fd12adadf7d1f60c21b4b83e779"
      ],
      "author": {
        "name": "Shawn Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 25 17:36:03 2012 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Oct 25 17:36:04 2012 -0700"
      },
      "message": "Merge \"project: Support config args in git command callables\""
    },
    {
      "commit": "ab8f911a6721424ddc7cda7ebd2a07270a5909b1",
      "tree": "cf4b0cfab756dc78747894189ef918a262811d48",
      "parents": [
        "608aff7f624e35348ff9fab74bad1d6921944238"
      ],
      "author": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Thu Oct 25 13:44:11 2012 -0700"
      },
      "committer": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Thu Oct 25 13:55:49 2012 -0700"
      },
      "message": "Fix pylint warnings introduced by the submodule patch\n\n\"69998b0 Represent git-submodule as nested projects\" has introduced a\nfew pylint warnings.\n\nW0612:1439,8:Project._GetSubmodules.get_submodules: Unused variable \u0027sub_gitdir\u0027\nW0613:1424,36:Project._GetSubmodules.get_submodules: Unused argument \u0027path\u0027\nW0612:1450,25:Project._GetSubmodules.parse_gitmodules: Unused variable \u0027e\u0027\nW0622:516,8:Sync.Execute: Redefining built-in \u0027all\u0027\n\nChange-Id: I84378e2832ed1b5ab023e394d53b22dcea799ba4\n"
    },
    {
      "commit": "608aff7f624e35348ff9fab74bad1d6921944238",
      "tree": "e1bdbb8af5927dd226d8e22dc382fd24c4cdfa5e",
      "parents": [
        "13657c407d0424d0866993bea39ed01094caa1c1",
        "a5be53f9c809009e67f217c00b8f30246aacc237"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Oct 25 10:03:36 2012 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Oct 25 10:03:37 2012 -0700"
      },
      "message": "Merge \"Use modern Python exception syntax\""
    },
    {
      "commit": "091f893625269fd12adadf7d1f60c21b4b83e779",
      "tree": "bec3e027600f88a73108aa3c0f2f8f122903733d",
      "parents": [
        "d947858325ae70ff9c0b2f463a9e8c4ffd00002a"
      ],
      "author": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Tue Oct 23 17:01:04 2012 -0700"
      },
      "committer": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Wed Oct 24 14:52:08 2012 -0700"
      },
      "message": "project: Support config args in git command callables\n\nChange-Id: I9d4d0d2b1aeebe41a6b24a339a154d258af665eb\n"
    },
    {
      "commit": "a5be53f9c809009e67f217c00b8f30246aacc237",
      "tree": "7ab0da1fd31968eee882de81df8c9b93ae52fdfb",
      "parents": [
        "9ed12c5d9cda1f010bc173b0bc622d59e96b0dd0"
      ],
      "author": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Sun Sep 09 15:37:57 2012 -0700"
      },
      "committer": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Tue Oct 23 21:35:59 2012 -0700"
      },
      "message": "Use modern Python exception syntax\n\n\"except Exception as e\" instead of \"except Exception, e\"\n\nThis is part of a transition to supporting Python 3.  Python \u003e\u003d 2.6\nsupport \"as\" syntax.\n\nNote: this removes Python 2.5 support.\n\nChange-Id: I309599f3981bba2b46111c43102bee38ff132803\n"
    },
    {
      "commit": "69998b0c6ff724bf620480140ccce648fec7d6a9",
      "tree": "b6f9c4c00b04a0f140074c4c2dba91ed4f055b11",
      "parents": [
        "5c6eeac8f0350fd6b14cf226ffcff655f1dd9582"
      ],
      "author": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Wed Jan 11 11:28:42 2012 +0800"
      },
      "committer": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Tue Oct 23 16:08:58 2012 -0700"
      },
      "message": "Represent git-submodule as nested projects\n\nWe need a representation of git-submodule in repo; otherwise repo will\nnot sync submodules, and leave workspace in a broken state.  Of course\nthis will not be a problem if all projects are owned by the owner of the\nmanifest file, who may simply choose not to use git-submodule in all\nprojects.  However, this is not possible in practice because manifest\nfile owner is unlikely to own all upstream projects.\n\nAs git submodules are simply git repositories, it is natural to treat\nthem as plain repo projects that live inside a repo project.  That is,\nwe could use recursively declared projects to denote the is-submodule\nrelation of git repositories.\n\nThe behavior of repo remains the same to projects that do not have a\nsub-project within.  As for parent projects, repo fetches them and their\nsub-projects as normal projects, and then checks out subprojects at the\ncommit specified in parent\u0027s commit object.  The sub-project is fetched\nat a path relative to parent project\u0027s working directory; so the path\nspecified in manifest file should match that of .gitmodules file.\n\nIf a submodule is not registered in repo manifest, repo will derive its\nproperties from itself and its parent project, which might not always be\ncorrect.  In such cases, the subproject is called a derived subproject.\n\nTo a user, a sub-project is merely a git-submodule; so all tips of\nworking with a git-submodule apply here, too.  For example, you should\nnot run `repo sync` in a parent repository if its submodule is dirty.\n\nChange-Id: I541e9e2ac1a70304272dbe09724572aa1004eb5c\n"
    },
    {
      "commit": "5c6eeac8f0350fd6b14cf226ffcff655f1dd9582",
      "tree": "3225695b9d2a97342a49127717ea5e2bc5935a63",
      "parents": [
        "e98607248eec2b149d84efe944c12cbef419b82e"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Oct 11 16:44:48 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Mon Oct 22 12:30:14 2012 +0900"
      },
      "message": "More coding style cleanup\n\nFixing more issues found with pylint.  Some that were supposed to\nhave been fixed in the previous sweep (Ie0db839e) but were missed:\n\nC0321: More than one statement on a single line\nW0622: Redefining built-in \u0027name\u0027\n\nAnd some more:\n\nW0631: Using possibly undefined loop variable \u0027name\u0027\nW0223: Method \u0027name\u0027 is abstract in class \u0027name\u0027 but is not overridden\nW0231: __init__ method from base class \u0027name\u0027 is not called\n\nChange-Id: Ie119183708609d6279e973057a385fde864230c3\n"
    },
    {
      "commit": "2f6ab7f5b8f21b2dbfe9ae102674bd1694e94f03",
      "tree": "040f9045751d83902ea8c479304fdfa2a0061a54",
      "parents": [
        "3a6cd4200e42fbb5a21b3fb8d3c9738c0320cc63"
      ],
      "author": {
        "name": "Mickaël Salaün",
        "email": "mic@digikod.net",
        "time": "Sun Sep 30 00:37:55 2012 +0200"
      },
      "committer": {
        "name": "Mickaël Salaün",
        "email": "mic@digikod.net",
        "time": "Wed Oct 10 08:30:15 2012 +0200"
      },
      "message": "Rename \"dir\" variables\n\nThe variable name \"dir\" conflicts with the name of a Python built-in\nfunction: http://docs.python.org/library/functions.html#dir\n\nChange-Id: I850f3ec8df7563dc85e21f2876fe5e6550ca2d8f\n"
    },
    {
      "commit": "8a68ff96057ec58e524a3e41a2d8dca7b5d016bc",
      "tree": "22f6971e8d3c4a90d11d3704602d073a852328b4",
      "parents": [
        "e3b1c45aebed329cbc9ad172b1d8e812cf208117"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Mon Sep 24 12:15:13 2012 +0900"
      },
      "committer": {
        "name": "Gustaf Lundh",
        "email": "gustaf.lundh@sonymobile.com",
        "time": "Tue Oct 09 12:45:30 2012 +0200"
      },
      "message": "Coding style cleanup\n\nFix the following issues reported by pylint:\n\nC0321: More than one statement on a single line\nW0622: Redefining built-in \u0027name\u0027\nW0612: Unused variable \u0027name\u0027\nW0613: Unused argument \u0027name\u0027\nW0102: Dangerous default value \u0027value\u0027 as argument\nW0105: String statement has no effect\n\nAlso fixed a few cases of inconsistent indentation.\n\nChange-Id: Ie0db839e7c57d576cff12d8c055fe87030d00744\n"
    },
    {
      "commit": "14a6674e32b3000dbe8b7c96b0d1bb4fb0021720",
      "tree": "024482226fefd4c188f20f56047325b69d388a9f",
      "parents": [
        "34acdd253439448b6c08c3abfc5e7b8bd03f383f"
      ],
      "author": {
        "name": "Brian Harring",
        "email": "ferringb@google.com",
        "time": "Fri Sep 28 20:21:57 2012 -0700"
      },
      "committer": {
        "name": "Brian Harring",
        "email": "ferringb@google.com",
        "time": "Fri Sep 28 22:31:27 2012 -0700"
      },
      "message": "manifest: record the original revision when in -r mode.\n\nCurrently when doing a sync against a revision locked manifest,\nsync has no option but to fall back to sync\u0027ing the entire refs space;\nit doesn\u0027t know which ref to ask for that contains the sha1 it wants.\n\nThis sucks if we\u0027re in -c mode; thus when we generate a revision\nlocked manifest, record the originating branch- and try syncing that\nbranch first.  If the sha1 is found within that branch, this saves\nus having to pull down the rest of the repo- a potentially heavy\nsaving.\n\nIf that branch doesn\u0027t have the desired sha1, we fallback to sync\u0027ing\neverything.\n\nChange-Id: I99a5e44fa1d792dfcada76956a2363187df94cf1\n"
    },
    {
      "commit": "2dc810c2e4028878b9c3484866a5973d5c33479d",
      "tree": "567de855659b91a4629d4b555b71612e4c8ed70c",
      "parents": [
        "bb1b5f5f863fca0e85764f5b35c117f5724d15c0"
      ],
      "author": {
        "name": "Matt Gumbel",
        "email": "matthew.k.gumbel@intel.com",
        "time": "Thu Aug 30 09:39:36 2012 -0700"
      },
      "committer": {
        "name": "gerrit code review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Sep 06 10:54:46 2012 -0700"
      },
      "message": "Fix errors when clone.bundle missing on server\n\nCatch curl failures to download clone.bundle; don\u0027t let git try to parse\nthe 404 page as a bundle file (was causing much user confusion).\n\nThis should eliminate false error messages from init and sync such as:\n  error: \u0027.repo/manifests.git/clone.bundle\u0027 does not look like a v2 bundle file\n  fatal: Could not read bundle \u0027.repo/manifests.git/clone.bundle\u0027.\n  error: RPC failed; result\u003d22, HTTP code \u003d 400\n\nSigned-off-by: Matt Gumbel \u003cmatthew.k.gumbel@intel.com\u003e\nChange-Id: I7994f7c0baecfb45bb5a5850c48bd2a0ffabe773\n"
    },
    {
      "commit": "bb1b5f5f863fca0e85764f5b35c117f5724d15c0",
      "tree": "0b6b8d0d6d027f2d0e0dd6fabdd4eafc6c919026",
      "parents": [
        "e2126652a3a1e08724a54091793bb29a79d31014"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Aug 13 13:11:18 2012 -0700"
      },
      "committer": {
        "name": "gerrit code review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Sep 05 11:46:48 2012 -0700"
      },
      "message": "Allow projects to be specified as notdefault\n\nInstead of every group being in the group \"default\", every project\nis now in the group \"all\".   A group that should not be downloaded\nby default may be added to the group \"notdefault\".\n\nThis allows all group names to be positive (instead of removing groups\ndirectly in the manifest with -default) and offers a clear way of\nselecting every project (--groups all).\n\nChange-Id: I99cd70309adb1f8460db3bbc6eff46bdcd22256f\n"
    },
    {
      "commit": "e15c65abc25cd1d5d77ec6815a3c011b9f57ddac",
      "tree": "43bd95e2e83abcd88c5d05b6a65393877c51028b",
      "parents": [
        "daa851f6cd9edb3851a3884fd2864f0f3dc583b2"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Aug 22 10:46:11 2012 +0900"
      },
      "committer": {
        "name": "Gustaf Lundh",
        "email": "gustaf.lundh@sonymobile.com",
        "time": "Thu Aug 23 12:15:26 2012 +0200"
      },
      "message": "Remove unused imports\n\nThere are several imports that are not used.  Remove them.\n\nChange-Id: I2ac3be66827bd68d3faedcef7d6bbf30ea01d3f2\n"
    },
    {
      "commit": "b9477bc2dd8ef1e931f208733976c56a0f2344a3",
      "tree": "02351b9af113f854c9b5e84c5f6567d78c40d06b",
      "parents": [
        "5e7127d00baf5bdad3e52cf8784c8aaa736395e1"
      ],
      "author": {
        "name": "Mickaël Salaün",
        "email": "mic@digikod.net",
        "time": "Sun Aug 05 13:39:26 2012 +0200"
      },
      "committer": {
        "name": "Mickaël Salaün",
        "email": "mic@digikod.net",
        "time": "Mon Aug 06 23:51:43 2012 +0200"
      },
      "message": "project.py: Replace the relpath function with os.path.relpath\n\nChange-Id: Ib313340344968211cecfc0a718f6072e41da1a91\n"
    },
    {
      "commit": "5e7127d00baf5bdad3e52cf8784c8aaa736395e1",
      "tree": "b28b86ba1eb092483d0f5e02f73e6532a167e8c9",
      "parents": [
        "5d0efdb14a31d651a0f6061ffb73452a20b7ed77"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Aug 02 14:57:37 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Aug 02 15:18:10 2012 -0700"
      },
      "message": "Use curl command line tool for clone.bundle\n\nurllib2 is not thread safe and may be causing sync to lock up or\nnot work correctly on various platforms. Instead use the command\nline curl program.\n\nChange-Id: I36eaf18bb4df089d26ea99d533cb015e7c616eb0\n"
    },
    {
      "commit": "e0904f721b51fb1f3f11fb4755e476d759b7b3e3",
      "tree": "3fe7b7c3826fbf7cf913551f759c4f1612c3b36d",
      "parents": [
        "9830553748a2a4a1930361b41a1076dbaa6d9f4a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Aug 01 20:44:23 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Aug 01 20:44:23 2012 -0700"
      },
      "message": "Fix unsupported operand type(s) for +: \u0027int\u0027 and \u0027str\u0027\n\nChange-Id: I88455107d63daaa60c3b33c010aa8c730a590c70\n"
    },
    {
      "commit": "9830553748a2a4a1930361b41a1076dbaa6d9f4a",
      "tree": "c98e7b66c28c1cef5648b917b1a2311de9e61acc",
      "parents": [
        "2bc7f5cb3af981d673b44ce9a1ff5a272535def6"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Aug 01 17:41:26 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Aug 01 17:41:26 2012 -0700"
      },
      "message": "Fix percent done on resumed /clone.bundle\n\nThe Content-Length when resuming is the number of bytes that\nremain in the file. To compute the total size as expected by\nthe progress meter, we must add the bytes already stored.\n\nWhile we are in this method fix uses of % operator to ensure\na tuple is always supplied.\n\nChange-Id: Ic899231b5bc0ab43b3ddb1d29845f6390e820115\n"
    },
    {
      "commit": "435370c6f0e202378ae233cf1088e499ba07e971",
      "tree": "17ef58db736d091ad62b54db0c7169b964ccb95e",
      "parents": [
        "e8f75fa3687bfe894a4fa8e59881b7d9170d8a41"
      ],
      "author": {
        "name": "Brian Harring",
        "email": "ferringb@chromium.org",
        "time": "Sat Jul 28 15:37:04 2012 -0700"
      },
      "committer": {
        "name": "Brian Harring",
        "email": "ferringb@google.com",
        "time": "Sat Jul 28 15:44:05 2012 -0700"
      },
      "message": "upload: add --draft option.\n\nChange-Id: I6967ff2f8163cd4116027b3f15ddb36875942af4\n"
    },
    {
      "commit": "e8f75fa3687bfe894a4fa8e59881b7d9170d8a41",
      "tree": "e43b915e9336ddfad189c3855107831300a47257",
      "parents": [
        "87636f2ac2d8a10e7db3be7b5dd47097cc1084ce"
      ],
      "author": {
        "name": "Torne (Richard Coles)",
        "email": "torne@google.com",
        "time": "Fri Jul 20 15:32:19 2012 +0100"
      },
      "committer": {
        "name": "Torne (Richard Coles)",
        "email": "torne@google.com",
        "time": "Fri Jul 20 15:33:17 2012 +0100"
      },
      "message": "Don\u0027t delete the branch config when switching branches.\n\nThe fix for issue #46 in 5d016502ebc6 appears to break syncing in some\nsituations: the branch is deleted after the point where it\u0027s been\nconfigured, which deletes part of its configuration and causes the\nconfig to change each time you call `repo init`, alternating between a\nconfiguration that works and one that doesn\u0027t.\n\nInstead of deleting the branch with git branch -D, use git update-ref -d\nwhich just deletes the ref (to avoid the rebase) without touching the\nconfiguration for the branch that was set up during the first repo init.\n\nThis appears to ensure the config is left in a valid state all the time\nno matter what combination of repo init commands you run, without\nreintroducing the rebasing issue.\n\nChange-Id: Iaadaa6e56a46840bbc593fa5b35cb5b34cd3ce69\n"
    },
    {
      "commit": "7cf1b36bcdc79c9239413e35b02dee54aa801a20",
      "tree": "9b51d1cac514908b2a74c046e7e28b219d106342",
      "parents": [
        "5e57234ec619d0de930333a8dde3004d1dc575d6"
      ],
      "author": {
        "name": "Florian Vallee",
        "email": "florian.vallee@gmail.com",
        "time": "Thu Jun 07 17:11:42 2012 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 13 10:36:17 2012 -0700"
      },
      "message": "Detach branch even when already on the latest revision using sync -d\n\nThis patch fixes repo behaviour when running sync -d with unmodified\ntopic branches.\n\nPrior to this patch sync -d would see the latest revision is already\nchecked out, thus staying on the branch. Since \"-d\" means detach we\nshould follow git\u0027s behaviour and actually detach from the branch in\nthat case.\n\nBasic test case - after a fresh repo init + sync -\n        * repo start --all testdetach\n        * repo sync -d\n        * repo status\n-\u003e status shows active topic branch \"testdetach\",\n   should show :\nnothing to commit (working directory clean)\n\nChange-Id: Ic1351e6b5721b76557a51ab09f9dd42c38a4b415\n"
    },
    {
      "commit": "5d016502ebc68bc054d85c98c6cdb51e0b63a1f5",
      "tree": "da1b47c86049f771f2292c507de21064842809d7",
      "parents": [
        "475a47d531bfe5ad82ec104189075df72a3143b7"
      ],
      "author": {
        "name": "Florian Vallee",
        "email": "florian.vallee@gmail.com",
        "time": "Thu Jun 07 17:19:26 2012 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 13 10:00:57 2012 -0700"
      },
      "message": "Fix switching manifest branches using repo init -b\n\nSee repo issue #46 :\n\thttps://code.google.com/p/git-repo/issues/detail?id\u003d46\n\nWhen using repo init -b on an already existing repository,\nthe next sync will try to rebase changes coming from the old manifest\nbranch onto the new, leading in the best case scenario to conflicts\nand in the worst case scenario to an incorrect \"mixed up\" manifest.\n\nThis patch fixes this by deleting the \"default\" branch in the local\nmanifest repository when the -d init switch is used, thus forcing\nrepo to perform a fresh checkout of the new manifest branch\n\nChange-Id: I379e4875ec5357d8614d1197b6afbe58f9606751\n"
    },
    {
      "commit": "eca119e5d6f0aa61cad6be1421aa523482e9cde7",
      "tree": "8a89308ba0e76e8922676351333d77afacdcaf49",
      "parents": [
        "6ba6ba0ef3ae4de384d931a50ec25e675e3aab16"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu May 24 15:39:14 2012 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu May 24 15:40:05 2012 -0700"
      },
      "message": "Allow projects with groups\u003dNone\n\nMirror manifest and repo projects are outside the manifest and\nhave no groups.  Allow project groups to be None for these\nprojects.\n\nChange-Id: I3e1c4add894fe1c43aa4e77a1fc1558aa10dd191\n"
    },
    {
      "commit": "6ba6ba0ef3ae4de384d931a50ec25e675e3aab16",
      "tree": "a570790f94d09ba475bc5f1b4a74462b6e409259",
      "parents": [
        "23acdd3f1460bc1c040b319940c5e0e8a78f1040"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 24 09:46:50 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 24 09:46:50 2012 -0700"
      },
      "message": "Fix initial sync broken by sync-c option\n\nChange-Id: I308753da8944e6ce5c46e3bfee1bcd41d5b7e292\n"
    },
    {
      "commit": "3d125940f6223efe62e35b795f57e7e717b4528e",
      "tree": "518bdd11c5cd3e5f57afdf16a3e1fe3ec1df8370",
      "parents": [
        "a94f162b9fe85389f3e1c9555628d9229105e15d"
      ],
      "author": {
        "name": "Pierre Tardy",
        "email": "pierre.tardy@intel.com",
        "time": "Fri May 04 12:18:12 2012 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 24 09:04:20 2012 -0700"
      },
      "message": "repo download: add --ff-only option\n\nAllows to ff-only a gerrit patch\nThis patch is necessary to automatically ensure that the patch will\nbe correctly submitted on ff-only gerrit projects\n\nYou can now use:\nrepo download (--ff-only|-f) project changeid/patchnumber\n\nThis is useful to automate verification of fast forward status of a patch\nin the context of build automation, and commit gating (e.g. buildbot)\n\nChange-Id: I403a667557a105411a633e62c8eec23d93724b43\nSigned-off-by: Erwan Mahe \u003cerwan.mahe@intel.com\u003e\nSigned-off-by: Pierre Tardy \u003cpierre.tardy@intel.com\u003e\n"
    },
    {
      "commit": "a94f162b9fe85389f3e1c9555628d9229105e15d",
      "tree": "da3852d6ede787a8d1974cddab3db8c98e4fc39e",
      "parents": [
        "e5a2122e6429b5eee861807e7050eb02045a7d4f"
      ],
      "author": {
        "name": "Erwan Mahe",
        "email": "erwan.mahe@intel.com",
        "time": "Fri Aug 19 13:56:09 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 24 09:03:10 2012 -0700"
      },
      "message": "repo download: add --revert option\n\nBZ: 4779\nAllows to revert a gerrit patch\nThis patch is necessary for the on-demand creation of\nengineering builds using buildbot\n\nYou can now use:\nrepo download [--revert|-r project changeid/patchnumber\n\nThis is useful to automate reverting of a patch\nin the context of build automation, and regression bisection\n\nChange-Id: I3985e80e4b2a230f83526191ea1379765a54bdcf\nSigned-off-by: Erwan Mahe \u003cerwan.mahe@intel.com\u003e\nSigned-off-by: Pierre Tardy \u003cpierre.tardy@intel.com\u003e\n"
    },
    {
      "commit": "e5a2122e6429b5eee861807e7050eb02045a7d4f",
      "tree": "b58878391a4a6a80bdda7edf096d22cff8b7f1c4",
      "parents": [
        "ccf86432b39ce2506fca472bbdbe379fdc53d3e3"
      ],
      "author": {
        "name": "Pierre Tardy",
        "email": "pierre.tardy@intel.com",
        "time": "Thu Mar 24 16:28:18 2011 +0100"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 24 09:02:38 2012 -0700"
      },
      "message": "repo download: add --cherry-pick option\n\ndefault option uses git checkout, and thus overwrite the previous\ncheckouts.  this is a problem for automated builds of several\nchangesets in the same project for daily builds of pending submission\n\nYou can now use:\nrepo download [--cherry-pick|-c] project changeid/patchnumber\n\nThis will parse the manifest, cd to the corresponding project\ndownload the changes to FETCH_HEAD and cherry-pick the result.\n\nThis is useful to automate cherry-picking of a patch\nin the context of build automation, and commit gating (e.g. buildbot)\n\nChange-Id: Ib638afd87677f1be197afb7b0f73c70fb98909fe\nSigned-off-by: Pierre Tardy \u003cpierre.tardy@intel.com\u003e\n"
    },
    {
      "commit": "79770d269e319dee578beed682669703d4c764ba",
      "tree": "23e733be2bf80454de9352225366b92ef5cc9139",
      "parents": [
        "c39864f5e12fa4a6d3f2cdb4921afc021406d106"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Fri Apr 20 14:41:59 2012 -0700"
      },
      "committer": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Mon Apr 23 14:10:52 2012 -0700"
      },
      "message": "Add sync-c option to manifest\n\nThere are use-cases when fetching all branch is impractical and\nwe really need to fetch only one branch/tag.\ne.g. there is a large project with binaries and every update of a\nbinary file is put to a separate branch.\nThe whole project history might be too large to allow users fetch it.\n\nAdd \u0027sync-c\u0027 option to \u0027project\u0027 and \u0027default\u0027 tags to make it possible\nto configure \u0027sync-c\u0027 behavior at per-project and per-manifest level.\n\nNote that currently there is no possibility to revert boolean flag from\ncommand line. If \u0027sync-c\u0027 is set in manifest then you cannot make\nfull fetch by providing a repo tool argument.\n\nChange-Id: Ie36fe5737304930493740370239403986590f593\n"
    },
    {
      "commit": "971de8ea7b7e474a4d9253b6c9f47da3f1130973",
      "tree": "d8ac52741957b38d57d15f208e57b984d71ddc19",
      "parents": [
        "24c130884018364f91baa8de0ff3541f4c32d1bb"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Apr 16 10:36:08 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 23 12:39:05 2012 -0700"
      },
      "message": "Refine groups functionality\n\nEvery project is in group \"default\".  \"-default\" does not remove\nit from this project.  All group names specified in the manifest\nare positive names as opposed to a mix of negative and positive.\n\nSpecified groups are resolved in order.  If init is supplied with\n--groups\u003d\"group1,-group2\", the following describes the project\nselection when syncing:\n\n  * all projects in \"group1\" will be added, and\n  * all projects in \"group2\" will be removed.\n\nChange-Id: I1df3dcdb64bbd4cd80d675f9b2d3becbf721f661\n"
    },
    {
      "commit": "24c130884018364f91baa8de0ff3541f4c32d1bb",
      "tree": "213b269d05e2a5f2b70d895325301a9a9f30e4a2",
      "parents": [
        "b962a1f5e0daad323bdd66fad93f00a3738cc255"
      ],
      "author": {
        "name": "James W. Mills",
        "email": "jameswmills@gmail.com",
        "time": "Thu Apr 12 15:04:13 2012 -0500"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 23 12:35:08 2012 -0700"
      },
      "message": "Add project annotation handling to repo\n\nAllow the optional addition of \"annotation\" nodes nested under\nprojects.  Each annotation node must have \"name\" and \"value\"\nattributes.  These name/value pairs will be exported into the\nenvironment during any forall command, prefixed with \"REPO__\"\n\nIn addition, an optional \"keep\" attribute with case insensitive \"true\"\nor \"false\" values can be included to determine whether the annotation\nwill be exported with \u0027repo manifest\u0027\n\nChange-Id: Icd7540afaae02c958f769ce3d25661aa721a9de8\nSigned-off-by: James W. Mills \u003cjameswmills@gmail.com\u003e\n"
    },
    {
      "commit": "b962a1f5e0daad323bdd66fad93f00a3738cc255",
      "tree": "aa93a22bdec6f982cfee5c3ab5d1f5361f7bd9e9",
      "parents": [
        "5acde75e5d70b323197ffb2c9d4fdea3612098f5"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Thu Mar 29 18:06:43 2012 -0700"
      },
      "committer": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Mon Apr 23 11:09:17 2012 -0700"
      },
      "message": "Check if SHA1 presents in repository\n\nPreviously repo had incorrect code that did not really check\nif sha1 presents in a project. It worked for tags though.\n\nCheck if a revision (either tag or sha1) is present by using\n\u0027git rev_parse\u0027 functionality.\n\nChange-Id: I1787f3348573948573948753987394839487572b\n"
    },
    {
      "commit": "5acde75e5d70b323197ffb2c9d4fdea3612098f5",
      "tree": "e995a64614ce7406633ae6e99c2a0e6f86872e09",
      "parents": [
        "d67872d2f47b2f09a0e2aa4adfd62e6f69154c9b"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Mar 28 20:15:45 2012 -0700"
      },
      "committer": {
        "name": "Shawn Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 13 09:46:00 2012 -0700"
      },
      "message": "Add manifest groups\n\nAllows specifying a list of groups with a -g argument to repo init.\nThe groups act on a group\u003d attribute specified on projects in the\nmanifest.\nAll projects are implicitly labelled with \"default\" unless they are\nexplicitly labelled \"-default\".\nPrefixing a group with \"-\" removes matching projects from the list\nof projects to sync.\nIf any non-inverted manifest groups are specified, the default label\nis ignored.\n\nChange-Id: I3a0dd7a93a8a1756205de1d03eee8c00906af0e5\nReviewed-on: https://gerrit-review.googlesource.com/34570\nReviewed-by: Shawn Pearce \u003csop@google.com\u003e\nTested-by: Shawn Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d67872d2f47b2f09a0e2aa4adfd62e6f69154c9b",
      "tree": "654e38712aec5961e0e628b8be95b260b7eb9c80",
      "parents": [
        "e9d6b611c5bec499360c175035770132f1e60c71"
      ],
      "author": {
        "name": "pelya",
        "email": "x.pelya.x@gmail.com",
        "time": "Wed Mar 28 14:49:58 2012 +0300"
      },
      "committer": {
        "name": "Shawn Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 13 09:20:10 2012 -0700"
      },
      "message": "Option for \u0027repo diff\u0027 to generate output suitable for \u0027patch\u0027 cmd\n\nThe -u option causes \u0027repo diff\u0027 to generate diff output\nwith file paths relative to the repository root,\nso the output can be applied to the Unix \u0027patch\u0027 command.\nThe name \u0027-u\u0027 was selected for convenience, because\nboth \u0027diff\u0027 and \u0027git diff\u0027 accept the option with the same name\nto generate an \u0027unified diff\u0027 output suitable for \u0027patch\u0027 command.\n\nChange-Id: I79c8356db4ed20ecaccc258b3ba139db76666fe0\nReviewed-on: https://gerrit-review.googlesource.com/34380\nReviewed-by: Shawn Pearce \u003csop@google.com\u003e\nTested-by: Shawn Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c3d2f2b76f1f34703106031bdbcb6c34df81686c",
      "tree": "af7b57c5e81512bcd7e3d7ab530069303c98fcfb",
      "parents": [
        "cd7c5deca0b0594bd8addd5a0fe18b962d2679e9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 22 14:09:22 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 22 14:18:40 2012 -0700"
      },
      "message": "Ignore /clone.bundle on HTTP 401, 403 and 404\n\n401: Unauthorized, authentication may be required. This is usually\n     handled internally by the HTTP client in Python. If it reaches\n     our code in repo, the Python HTTP client didn\u0027t find a password\n     in ~/.netrc that it could use.\n\n403: Authentication was supplied, but is incorrect. It might be\n     that the CDN doesn\u0027t want to offer this clone.bundle file\n     to the client, but the Git fetch operation would still be\n     successful. This might arise if branch level read controls\n     were used in Gerrit Code Review and the /clone.bundle file\n     contained branches not visible to the client.\n\n404: The server has no /clone.bundle file available.\n\nIn all of these cases, sliently ignore the /clone.bundle file HTTP\nerror and let the Git operation take over.\n\nChange-Id: I1787f3cac86b017351952bbb793fe5874d83c72b\n"
    },
    {
      "commit": "cd7c5deca0b0594bd8addd5a0fe18b962d2679e9",
      "tree": "ec56d17e669c94bd297d8080f4f5bbb226a4841c",
      "parents": [
        "e02ac0af2e69f2c149de942d639bf305e5ae391a"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Tue Mar 20 13:45:00 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 20 14:11:56 2012 -0700"
      },
      "message": "Do not change branch.foo.merge in case of manifest sync\n\nIn case of manifest/smart sync repo changes \".merge\" config\noption from branch to SHA. Doing \u0027repo upload\u0027 fails as\nrepo tries to upload to a remote branch that looks like SHA\n(e.g. refs/for/23423423423423423423423)\n\nDo not update the .merge in case if revision is SHA.\n\nChange-Id: I9139708fa17f21eec5a7e23c3255333626bf529e\n"
    },
    {
      "commit": "e02ac0af2e69f2c149de942d639bf305e5ae391a",
      "tree": "47da1f6f01e8429659ca10de890c9747c2a0e80a",
      "parents": [
        "898e12a2d9340706eca79e6c611166dfe35a1d3e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 14 15:36:59 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 14 15:38:28 2012 -0700"
      },
      "message": "sync: --no-clone-bundle disables the clone bundle support\n\nChange-Id: Ia9ed7da8451b273c1be620c3dd0dcad777b29096\n"
    },
    {
      "commit": "898e12a2d9340706eca79e6c611166dfe35a1d3e",
      "tree": "f417382da1c4237825dc13b47194dd98ecd808f0",
      "parents": [
        "ae0a36c9a59e7f872578b17b3b7fa8f72df3cb59"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 14 15:22:28 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 14 15:28:22 2012 -0700"
      },
      "message": "Permit - in URL schemes for special URLs\n\nClients might be using their own special git-remote-* helper that\nhas a hypen in its name. Permit - in the scheme part of the URL\nwhen trying to decide if it is an SSH URL and assume it is *not*\nSSH if the URL matches \"foo-bar://\" style.\n\nChange-Id: I7ba2d810a614f6e605a441d5972902c4a14e73fd\n"
    },
    {
      "commit": "76abcc1d1ea2da6cf0ce381486e2f9bf4ca55c36",
      "tree": "99bb142cb8baeb9f3b0210dee1457f854ea985ba",
      "parents": [
        "d3153825723b2bec3476e84f2e423c646fd4c598"
      ],
      "author": {
        "name": "Ali Utku Selen",
        "email": "aliutku.selen@sonyericsson.com",
        "time": "Wed Jan 25 10:51:12 2012 +0100"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 12 12:25:40 2012 -0700"
      },
      "message": "repo status to print project name on clean gits\n\nrepo status just prints \"# on branch oprofile\" if you have branched\nin clean status. This doesn\u0027t really tell which branch is meant.\n\nInstead we can use the same syntax with modified gits which will\ngive us detailed information.\n\nChange-Id: I55fe5154d278e10a814281dd2ba501ec6e956730\n"
    },
    {
      "commit": "d3153825723b2bec3476e84f2e423c646fd4c598",
      "tree": "11436435822daca2da44674fc538b3a668c199a5",
      "parents": [
        "43bda84362b8fd8bb74a81003e8b49cff15ea5ed"
      ],
      "author": {
        "name": "Mike Pontillo",
        "email": "pontillo@gmail.com",
        "time": "Tue Feb 28 11:53:24 2012 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 12 12:24:22 2012 -0700"
      },
      "message": "Add \u0027rebase\u003d\"false\"\u0027 attribute to the \u003cproject/\u003e XML.\n\nThis new attribute can prevent \u0027repo sync\u0027 from automatically rebasing.\n\nI hit a situation in where one of the git repositories I was tracking\nwas actually an external repository that I wanted to pull commits\ninto and merge myself. (NOT rebase, since that would lose the merge\nhistory.) In this case, I\u0027m not using \u0027repo upload\u0027, I\u0027m manually\nmanaging the merges to and from this repository.\n\nEverything was going great until I typed \u0027repo sync\u0027 and it rebased\nmy manually-merged tree. Hence the option to skip it.\n\nChange-Id: I965e0dd1acb87f4a56752ebedc7e2de1c502dbf8\n"
    },
    {
      "commit": "43bda84362b8fd8bb74a81003e8b49cff15ea5ed",
      "tree": "6d7a8606c95c460ef85d4352e86e0aa0f053830e",
      "parents": [
        "9b017dab46bd5b61f8719a3f2d7ca301ea0f6f69"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Mar 12 11:25:04 2012 -0700"
      },
      "committer": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Mar 12 12:13:15 2012 -0700"
      },
      "message": "Avoid missing content-length header in project.py\n\nOccassionally, the content-length may be missing when using urlib\nin python 2.6 and 2.7.  This change assumes the value of the header is\n0 if it doesn\u0027t exist\n\nChange-Id: Iaf1c8a796bc667823d4d7c30f9b617644b271d00\n"
    },
    {
      "commit": "c9571423f843340de19ef576ccaa418ac72fdb58",
      "tree": "938fdcdde76dfc1cc8b299e0f6d96648242902e1",
      "parents": [
        "34fb20f67c7bdca2b1321a40f2fd558f9a34d866"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jan 11 14:58:54 2012 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jan 11 16:18:40 2012 -0800"
      },
      "message": "upload: Support uploading to Gerrit over https://\n\nIf SSH is not available, Gerrit returns NOT_AVAILABLE to the /ssh_info\nquery made by repo upload. In this case fallback to the /p/$PROJECT URL\nthat Gerrit also exports and use that for uploads.\n\nChange-Id: I1e3e39ab709ecc0a692614a41a42446426f39c08\n"
    },
    {
      "commit": "2a32f6afa64c88142a476cd719d29cebacbdfd19",
      "tree": "c268998cae067d7e80b828c68cb78f3bd0809a53",
      "parents": [
        "498fe90b455e896e306498abd24961fd90a21c67"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Tue Aug 30 10:52:33 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 12:09:35 2011 -0800"
      },
      "message": "Fix typo\n\nChange-Id: Idd68ad0a34fcf4bd4e18b0248f50187a539d610a\n"
    },
    {
      "commit": "53d6f4d17e0cb4eabcd604d584a1132a51cc8bf3",
      "tree": "c9effdc3a5d890ac55fb8a9f2aa68ac0d500873e",
      "parents": [
        "9d8f914fe8ac75e18e0da2b7ce4886a2ba490fc6"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Thu Aug 25 17:21:47 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 03 13:08:27 2011 -0700"
      },
      "message": "Add a sync flag that fetches only current branch\n\nThere is also shortcuts in case if the \"current branch\" is\na persistent revision such as tag or sha1. We check if the\npersistent revision is present locally and if it does - do\nno fetch anything from the server.\n\nThis greately reduces sync time and size of the on-disk repo\n\nChange-Id: I23c6d95185474ed6e1a03c836a47f489953b99be\n"
    },
    {
      "commit": "df5ee52050a5b8ea4e0bb69c007dac556c18ec03",
      "tree": "760f85dcd1039e3ba6110d39cc041c664730e7cb",
      "parents": [
        "fab96c68e3acfb5403ffe65577563f3cb39e2530"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 14:05:21 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 14:06:11 2011 -0700"
      },
      "message": "Fix Python 2.4 support\n\nChange-Id: I89521ae52fa564f0d849cc51e71fee65b3c47bab\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fab96c68e3acfb5403ffe65577563f3cb39e2530",
      "tree": "972a82f40c3e7de6b88f174f5f5b2a3418f92e40",
      "parents": [
        "bf1fbb20ab33cc479881a2b755e336872971dd78"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 12:00:38 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 12:18:07 2011 -0700"
      },
      "message": "Work around Python 2.7 urllib2 bug\n\nIf the remote is using authenticated HTTP, but does not have\n$GIT_URL/clone.bundle files in each repository, an initial sync\nwould fail around 8 projects in due to the library not resetting\nthe number of failures after getting a 404.\n\nWork around this by updating the retry counter ourselves.\n\nThe urllib2 library is also not thread-safe. Make it somewhat\nsafer by wrapping the critical section with a lock.\n\nChange-Id: I886e2750ef4793cbe2150c3b5396eb9f10974f7f\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "bf1fbb20ab33cc479881a2b755e336872971dd78",
      "tree": "753dc46108148ffa4a579a932e599e6b85450f30",
      "parents": [
        "29472463ba601e9c0513eadb19470e435b2601a1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 09:31:58 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 09:31:58 2011 -0700"
      },
      "message": "Fix AttributeError: \u0027HTTPError\u0027 object has no attribute \u0027reason\u0027\n\nNot every version of urllib2 supplies a reason object on the\nHTTPError exception that it throws from urlopen().  Work around\nthis by using str(e) instead and hope the string formatting includes\nsufficient information.\n\nChange-Id: I0f4586dba0aa7152691b2371627c951f91fdfc8d\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "29472463ba601e9c0513eadb19470e435b2601a1",
      "tree": "5dc815bb61bd53c60fd301f429d779994ef07f9b",
      "parents": [
        "c325dc35f621fe24d0460bb14547cdb51e00c00b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 09:24:07 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 09:24:07 2011 -0700"
      },
      "message": "Work around Python 2.7 failure to initialize base class\n\nurllib2 returns a malformed HTTPError object in certain situations.\nFor example, urllib2 has a couple of places where it creates an\nHTTPError object with no fp:\n\n  if self.retried \u003e 5:\n    # retry sending the username:password 5 times before failing.\n    raise HTTPError(req.get_full_url(), 401, \"basic auth failed\",\n                    headers, None)\n\nWhen it does that, HTTPError\u0027s ctor doesn\u0027t call through to\naddinfourl\u0027s ctor:\n\n  # The addinfourl classes depend on fp being a valid file\n  # object.  In some cases, the HTTPError may not have a valid\n  # file object.  If this happens, the simplest workaround is to\n  # not initialize the base classes.\n  if fp is not None:\n    self.__super_init(fp, hdrs, url, code)\n\nWhich means the \u0027headers\u0027 slot in addinfourl is not initialized and\ninfo() fails.  It is completely insane that urllib2 decides not to\ninitialize its own base class sometimes.\n\nChange-Id: I32a0d738f71bdd7d38d86078b71d9001e26f1ec3\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c325dc35f621fe24d0460bb14547cdb51e00c00b",
      "tree": "9154d75a5a5348609fc3b6d637871298c831b407",
      "parents": [
        "f322b9abb4cadc67b991baf6ba1b9f2fbd5d7812"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Oct 03 08:30:24 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Oct 03 08:30:24 2011 -0700"
      },
      "message": "sync: Fetch after applying bundle and retry after errors\n\nAfter a $GIT_URL/clone.bundle has been applied to the new local\nrepository, perform an incremental fetch using `git fetch` to ensure\nthe local repository is up-to-date. This allows the hosting server\nto offer stale /clone.bundle files to bootstrap a new client.\n\nIf a single git fetch fails, it may succeed again after a short\ndelay.  Transient failures are typical in environments where the\nremote Git server happens to have limits on how many requests it\ncan serve at once (the anonymous git daemon, or an HTTP server).\nWait a randomized delay between 30 and 45 seconds and retry the\nfailed project once.  This delay gives the site time to recover\nfrom a transient traffic spike, and the randomization makes it less\nlikely that a spike occurs again from all of the same clients.\n\nChange-Id: I97fb0fcb33630fb78ac1a21d1a4a3e2268ab60c0\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f322b9abb4cadc67b991baf6ba1b9f2fbd5d7812",
      "tree": "ce75a04fed2e84457800325d158de13645cef67e",
      "parents": [
        "db728cd866d4950779620993e12e76f09eb6e2ee"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 14:50:58 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Sep 28 10:07:36 2011 -0700"
      },
      "message": "sync: Support downloading bundle to initialize repository\n\nAn HTTP (or HTTPS) based remote server may now offer a \u0027clone.bundle\u0027\nfile in each repository\u0027s Git directory. Over an http:// or https://\nremote repo will first ask for \u0027$URL/clone.bundle\u0027, and if present\ndownload this to bootstrap the local client, rather than relying\non the native Git transport to initialize the new repository.\n\nBundles may be hosted elsewhere. The client automatically follows a\nHTTP 302 redirect to acquire the bundle file. This allows servers\nto direct clients to cached copies residing on content delivery\nnetworks, where the bundle may be closer to the end-user.\n\nBundle downloads are resumeable from where they last left off,\nallowing clients to initialize large repositories even when the\nconnection gets interrupted.\n\nIf a bundle does not exist for a repository (a HTTP 404 response\ncode is returned for \u0027$URL/clone.bundle\u0027), the native Git transport\nis used instead. If the client is performing a shallow sync, the\nbundle transport is not used, as there is no way to embed shallow\ndata into the bundle.\n\nChange-Id: I05dad17792fd6fd20635a0f71589566e557cc743\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "65e0f35fda0559e79316c8fdbeeaed6dd51e9a4d",
      "tree": "4944d8cc649b3b9af33f11181d27bee7b709adbb",
      "parents": [
        "08c880db1882743900ce1ed82b5026566b64d1f5"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Mon Apr 18 11:23:29 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jul 20 07:34:23 2011 -0700"
      },
      "message": "Add commit-msg hook also for manifest project\n\nThe manifest project has - by design - not a review URL associated\nwith it. It is actually not even a \u0027project\u0027 in repo\u0027s sense.\n\nThis will prevent the commit-msg hook from being added, which is\nnot necessarily wanted as the project is managed in gerrit.\n\nThis commit will enable the commit-msg hook, which in turn will\nadd the Change-Id-line to every new commit in it. This simplifies\nreplacing patch sets (by git push ... refs/for/...).\n\nChange-Id: I42d0f6fd79e6282d9d47074a3819e68d968999a7\nSigned-off-by: Victor Boivie \u003cvictor.boivie@sonyericsson.com\u003e\n"
    },
    {
      "commit": "30d452905f166b316152f236422f85c8aa75a2d0",
      "tree": "cc6a18adb2ea8c0f209f21aca2e64fe20fb06005",
      "parents": [
        "d6c93a28ca8cb079f473f749d805dcff97990225"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@chromium.org",
        "time": "Wed May 04 15:01:04 2011 -0700"
      },
      "committer": {
        "name": "Doug Anderson",
        "email": "dianders@chromium.org",
        "time": "Thu Jun 09 16:48:23 2011 -0700"
      },
      "message": "Add a --depth option to repo init.\n\nChange-Id: Id30fb4a85f4f8a1847420b0b51a86060041eb5bf\n"
    },
    {
      "commit": "d6c93a28ca8cb079f473f749d805dcff97990225",
      "tree": "21cd307899c2a5d1e59df9929d63651ac2ba1da1",
      "parents": [
        "d572a13021b0430eddf83e9caedc9d5add693c62"
      ],
      "author": {
        "name": "Mandeep Singh Baines",
        "email": "msb@google.com",
        "time": "Thu May 26 10:34:11 2011 -0700"
      },
      "committer": {
        "name": "Mandeep Singh Baines",
        "email": "msb@google.com",
        "time": "Thu May 26 10:49:39 2011 -0700"
      },
      "message": "Add branch support to repo upload\n\nThis commit adds a --br\u003d\u003cbranch\u003e option to repo upload.\n\nrepo currently examines every non-published branch. This is problematic\nfor my workflow. I have many branches in my kernel tree. Many of these\nbranches are based off of upstream remotes (I have many remotes) and\nwill never be uploaded (they\u0027ll get sent upstream as a patch).\n\nHaving repo scan these branches adds to my upload processing time\nand clutters the branch selection buffer. I\u0027ve also seen repo get\nconfused when one of my branches is 1000s of commits different from\nm/master.\n\nChange-Id: I68fa18951ea59ba373277b57ffcaf8cddd7e7a40\n"
    },
    {
      "commit": "3ba5f95b46f06ed3d7382346de29ac550d749ec9",
      "tree": "7b38fcbfc0f0237102b4b94b68684b49cb2d0113",
      "parents": [
        "2630dd9787c1b75b70a980175ffa41b63f59e3b8"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Thu Apr 07 12:51:04 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 07 16:55:35 2011 -0400"
      },
      "message": "Fixed repo checkout error message when git reports errors.\n\nIn the current version of repo checkout, we often get the error:\n  error: no project has branch xyzzy\n\n...even when the actual error was something else.  This fixes it\nto only report the \u0027no project has branch\u0027 when that is actually true.\n\nThis fix is very similar to one made for \u0027repo abandon\u0027:\n  https://review.source.android.com/#change,22207\n\nThe repo checkout error is filed as: \u003chttp://crosbug.com/6514\u003e\n\nTEST\u003dmanual\n\nA sample creating a case where \u0027git checkout\u0027 will fail:\n\n  $ repo start branch1 .\n  $ repo start branch2 .\n  $ touch bogusfile\n  $ git add bogusfile\n  $ git commit -m \"create bogus file\"\n  [branch2 f8b6b08] create bogus file\n   0 files changed, 0 insertions(+), 0 deletions(-)\n   create mode 100644 bogusfile\n  $ echo \"More\" \u003e\u003e bogusfile\n  $ repo checkout branch1 .\n  error: chromite/: cannot checkout branch1\n\nA sample case showing that we still fail if no project has a branch:\n\n  $ repo checkout xyzzy .\n  error: no project has branch xyzzy\n\nChange-Id: I48a8e258fa7a9c1f2800dafc683787204bbfcc63\n"
    },
    {
      "commit": "dafb1d68d33137779c96a83c7e42cac0e7a27ca4",
      "tree": "e0e3c93d316c8cdf48a15fec97c458b391a6039e",
      "parents": [
        "4655e81a75f2ea5f1eaf93de1249886171281e61"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Thu Apr 07 11:46:59 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 07 16:49:23 2011 -0400"
      },
      "message": "Fixed repo abandon to give better messages.\n\nThe main fix is to give an error message if nothing was actually\nabandoned.  See \u003chttp://crosbug.com/6041\u003e.\n\nThe secondary fix is to list projects where the abandon happened.\nThis could be done in a separate CL or dropped altogether if requested.\n\nTEST\u003dmanual\n\n$ repo abandon dougabc; echo $?\nAbandon dougabc: 100% (127/127), done.\nAbandoned in 2 project(s):\n  chromite\n  src/platform/init\n0\n\n$ repo abandon dougabc; echo $?\nAbandon dougabc: 100% (127/127), done.\nerror: no project has branch dougabc\n1\n\n$ repo abandon dougabc; echo $?\nAbandon dougabc: 100% (127/127), done.\nerror: chromite/: cannot abandon dougabc\n1\n\nChange-Id: I79520cc3279291acadc1a24ca34a761e9de04ed4\n"
    },
    {
      "commit": "4655e81a75f2ea5f1eaf93de1249886171281e61",
      "tree": "81ff7048880220c90c9ab0a7c5346a8dfab32a6d",
      "parents": [
        "723c5dc3d62fe07ba4faa17434870917ae87ce9d"
      ],
      "author": {
        "name": "Terence Haddock",
        "email": "thaddock@google.com",
        "time": "Thu Mar 31 12:33:34 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 07 16:36:42 2011 -0400"
      },
      "message": "Add option to check status of projects in parallel.\n\nChange-Id: I6ac653f88573def8bb3d96031d3570ff966251ad\n"
    },
    {
      "commit": "0960b5b53df6df7169c295de5509b0f705352d3b",
      "tree": "3c0c8b10ec274b1c4621e626a06afdaa2ea390e9",
      "parents": [
        "fc06ced9f9b8b00841991b92a2a661302a69eb7b"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Fri Nov 26 13:42:13 2010 +0100"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 17 09:19:51 2011 -0700"
      },
      "message": "Creating rr-cache\n\nIf git-rerere is enabled, it uses the rr-cache directory that\nrepo currently creates a symlink from, but doesn\u0027t create the\ndestination directory (inside the project\u0027s directory). Git\nwill then complain during merges and rebases.\n\nThis commit creates the rr-cache directory inside the project.\n\nChange-Id: If8b57a04f022fc6ed6a7007d05aa2e876e6611ee\n"
    },
    {
      "commit": "37282b4b9c5b1d9a1ff07f7f0686a81b65a0a5c6",
      "tree": "aba568b85d38de4cfef90cd771169c9422aef09c",
      "parents": [
        "835cd6888f16ff30a3428adfa3a775efad918880"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Fri Mar 04 11:54:18 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Mar 11 11:53:23 2011 -0800"
      },
      "message": "Support repo-level pre-upload hook and prep for future hooks.\n\nAll repo-level hooks are expected to live in a single project at the\ntop level of that project.  The name of the hooks project is provided\nin the manifest.xml.  The manifest also lists which hooks are enabled\nto make it obvious if a file somehow failed to sync down (or got\ndeleted).\n\nBefore running any hook, we will prompt the user to make sure that it\nis OK.  A user can deny running the hook, allow once, or allow\n\"forever\" (until hooks change).  This tries to keep with the git\nspirit of not automatically running anything on the user\u0027s computer\nthat got synced down.  Note that individual repo commands can add\nalways options to avoid these prompts as they see fit (see below for\nthe \u0027upload\u0027 options).\n\nWhen hooks are run, they are loaded into the current interpreter (the\none running repo) and their main() function is run.  This mechanism is\nused (instead of using subprocess) to make it easier to expand to a\nricher hook interface in the future.  During loading, the\ninterpreter\u0027s sys.path is updated to contain the directory containing\nthe hooks so that hooks can be split into multiple files.\n\nThe upload command has two options that control hook behavior:\n  - no-verify\u003dFalse, verify\u003dFalse (DEFAULT):\n    If stdout is a tty, can prompt about running upload hooks if needed.\n    If user denies running hooks, the upload is cancelled.  If stdout is\n    not a tty and we would need to prompt about upload hooks, upload is\n    cancelled.\n  - no-verify\u003dFalse, verify\u003dTrue:\n    Always run upload hooks with no prompt.\n  - no-verify\u003dTrue, verify\u003dFalse:\n    Never run upload hooks, but upload anyway (AKA bypass hooks).\n  - no-verify\u003dTrue, verify\u003dTrue:\n    Invalid\n\nSample bit of manifest.xml code for enabling hooks (assumes you have a\nproject named \u0027hooks\u0027 where hooks are stored):\n  \u003crepo-hooks in-project\u003d\"hooks\" enabled-list\u003d\"pre-upload\" /\u003e\n\nSample main() function in pre-upload.py in hooks directory:\n  def main(project_list, **kwargs):\n    print (\u0027These projects will be uploaded: %s\u0027 %\n           \u0027, \u0027.join(project_list))\n    print (\u0027I am being a good boy and ignoring anything in kwargs\\n\u0027\n           \u0027that I don\\\u0027t understand.\u0027)\n    print \u0027I fail 50% of the time.  How flaky.\u0027\n    if random.random() \u003c\u003d .5:\n      raise Exception(\u0027Pre-upload hook failed.  Have a nice day.\u0027)\n\nChange-Id: I5cefa2cd5865c72589263cf8e2f152a43c122f70\n"
    },
    {
      "commit": "835cd6888f16ff30a3428adfa3a775efad918880",
      "tree": "8570e971b5e44a0d75341f8eb467ab19e0a09529",
      "parents": [
        "8ced8641c88d37891a46d42ac1805e380ef6c377"
      ],
      "author": {
        "name": "Skyler Kaufman",
        "email": "skyler@google.com",
        "time": "Tue Mar 08 12:14:41 2011 -0800"
      },
      "committer": {
        "name": "Skyler Kaufman",
        "email": "skyler@google.com",
        "time": "Tue Mar 08 13:48:24 2011 -0800"
      },
      "message": "Post-nonexistent-revision crash sidestepped\n\nFix for the bug that leaves a fractional .git directory after attempting to\nperform an initial sync to a nonexistent revision. Moved the initialization of\nthe working directory to after the revision ID has already been checked. Now,\nno project/.git directory gets created at all if the revision ID is bad.\n\nChange-Id: I0c9b2a59573410f1d11de7661591bf02e4ce326b\n"
    },
    {
      "commit": "8ced8641c88d37891a46d42ac1805e380ef6c377",
      "tree": "bb32899a9865ae64a269576598bcc801b69bbcf7",
      "parents": [
        "2536f806258ce2038eea73269290559906cab99a"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Mon Jan 10 14:16:30 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Feb 01 09:57:29 2011 -0800"
      },
      "message": "Renamed \u0027repo_hooks\u0027 function to \u0027_ProjectHooks\u0027.\n\nThis renaming was done for two reasons:\n1. The hooks are actually project-level hooks, not repo-level\n   hooks.  Since we are talking about adding repo-level hooks,\n   It keeps things less confusing if we name the existing hooks\n   to be \"ProjectHooks\"\n2. The function is a private function in project.py and so\n   should have capitalization to match.\n\nI also added a docstring describing this function.\n\nChange-Id: I1d30f5de08e8f9f99f78146e68c76f906782d97e\n"
    },
    {
      "commit": "2536f806258ce2038eea73269290559906cab99a",
      "tree": "272214c4b003a517f5748aaa092ab8f47cd5caa7",
      "parents": [
        "0ce6ca9c7bc285eb644cdaacec92afca24939841"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Mon Jan 10 12:38:37 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Feb 01 09:53:56 2011 -0800"
      },
      "message": "Fixed bug identifying \u0027commit-msg\u0027 files.\n\nThere was a minor typo that would cause repo to (I believe)\nmistakenly identify any file that contained a substring of the\nword \u0027commit-msg\u0027 as a commit message hook.  For example, the file\n\u0027mit\u0027 or the file \u0027msg\u0027 would be treated as a commit message hook.\nI believe that it was intended that repo only recognize files\nnamed exactly \u0027commit-msg\u0027.\n\nChange-Id: I93edbddf3da3cf0935641e6efb19b0a8ee6e2308\n"
    },
    {
      "commit": "0ce6ca9c7bc285eb644cdaacec92afca24939841",
      "tree": "0c3a9d5ddb1beb8fea6ae8edfc99cb81ece4e419",
      "parents": [
        "0fc3a3982922a5c211da7ec85e6ec86b65294566"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 13:26:01 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 13:26:34 2011 -0800"
      },
      "message": "Fix mirror clients with no worktree\n\nCommit \"Make path references OS independent\" (df14a70c45)\nbroke mirror clients by trying to invoke replace() on None\nwhen there is no worktree.\n\nChange-Id: Ie0a187058358f7dcdf83119e45cc65409c980f11\n"
    },
    {
      "commit": "df14a70c4529821d7450303ec553a9f608af1656",
      "tree": "4631409d5610fb103912687dc4f8321d9b46f3a4",
      "parents": [
        "f18cb761731a791bf1b9ee8c6308bfce5c9d3e62"
      ],
      "author": {
        "name": "Anthony Newnam",
        "email": "anthony.newnam@garmin.com",
        "time": "Sun Jan 09 17:31:57 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:19 2011 -0800"
      },
      "message": "Make path references OS independent\n\nChange-Id: I5573995adfd52fd54bddc62d1d1ea78fb1328130\n(cherry picked from commit b0f9a02394779c1c9422a9649412c9ac5fb0f12f)\n\nConflicts:\n\n\tcommand.py\n"
    },
    {
      "commit": "a0de6e8eab97f5dcdb2f51d4e09dd1568623ec58",
      "tree": "14a6939f997a33d04396627e1b032b812bfcec2d",
      "parents": [
        "16614f86b3cc8d61ccae7197624fa93fc752767b"
      ],
      "author": {
        "name": "Ficus Kirkpatrick",
        "email": "ficus@android.com",
        "time": "Fri Oct 22 13:06:47 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:12:56 2010 -0700"
      },
      "message": "upload: Remove --replace option\n\nIt hasn\u0027t been necessary for a long time, and its\nfunctionality can be accomplished with \u0027git push\u0027.\n\nChange-Id: Ic00d3adbe4cee7be3955117489c69d6e90106559\n"
    },
    {
      "commit": "16614f86b3cc8d61ccae7197624fa93fc752767b",
      "tree": "218818ddc0e9521a85aa804477e59fff6f28364e",
      "parents": [
        "88443387b1b0508f43b57e104821c6b375806fea"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:05:43 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:08:57 2010 -0700"
      },
      "message": "sync --quiet: be more quiet\n\nChange-Id: I5e8363c7b32e4546d1236cfc5a32e01c3e5ea8e6\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "88443387b1b0508f43b57e104821c6b375806fea",
      "tree": "d3d1e5a3e6caecd8eabbdf7a1491ddcc2788aa3d",
      "parents": [
        "99482ae58a74e236fb40b65c267163a5690f39e1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 08 10:02:09 2010 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:08:50 2010 -0700"
      },
      "message": "sync: Enable use of git clone --reference\n\nUse git clone to initialize a new repository, and when possible\nallow callers to use --reference to reuse an existing checkout as\nthe initial object storage area for the new checkout.\n\nChange-Id: Ie27f760247f311ce484c6d3e85a90d94da2febfc\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a5ece0e0505324218f38af02a1fe046ca2bcc278",
      "tree": "429cbf0b23d2606737629e7fc77a4ad0b228c90a",
      "parents": [
        "cc50bac8c7706082596d70756249d4964a67f281"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:52:42 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:52:42 2010 -0700"
      },
      "message": "upload -t: Automatically include local branch name\n\nIf the -t flag is given to upload, the local branch name is\nautomatically sent to Gerrit Code Review as the topic branch name\nfor the change(s).  This requires the server to be Gerrit Code\nReview v2.1.3-53-gd50c94e or later, which isn\u0027t widely deployed\nright now, so the default is opt-out.\n\nChange-Id: I034fcacb405b7cb909147152db427fe69dd7bcbf\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "cc50bac8c7706082596d70756249d4964a67f281",
      "tree": "bb87e8d8c128737710db6f00b35327ef28750c5b",
      "parents": [
        "0cb1b3f687da4634e431953ef84fee59dd3f5d59"
      ],
      "author": {
        "name": "Anthony Newnam",
        "email": "anthony.newnam@garmin.com",
        "time": "Thu Apr 08 10:28:59 2010 -0500"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:43:58 2010 -0700"
      },
      "message": "Warn users before uploading if there are local changes\n\nChange-Id: I231d7b6a3211e9f5ec71a542a0109b0c195d5e40\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0cb1b3f687da4634e431953ef84fee59dd3f5d59",
      "tree": "86da739f320891f1b8383eb0579d267e550f9a75",
      "parents": [
        "9e426aa43231073c4a98dae3f6c16d67ab6f3b59"
      ],
      "author": {
        "name": "Julius Gustavsson",
        "email": "juliusb@gmail.com",
        "time": "Thu Jun 17 17:55:02 2010 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:38:08 2010 -0700"
      },
      "message": "sync: Try fetching a tag as a last resort before giving up\n\nIf a tagged commit is not reachable by the fetch refspec configured\nfor the git (usually refs/heads/*) it will not be downloaded by\n\u0027git fetch\u0027.  The tag can however be downloaded with \u0027git fetch\n--tags\u0027 or \u0027git fetch tag \u003ctag\u003e\u0027.\n\nThis patch fixes the situation when a tag is not found after a\n\u0027git fetch\u0027. Repo will issue \u0027git fetch tag \u003ctag\u003e\u0027 before giving\nup completely.\n\nChange-Id: I87796a5e1d51fcf398f346a274b7a069df37599a\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2daf66740bba0b2726462a547910d16cf0822db2",
      "tree": "45139dbc584bdbe297eaea71e6ff71822eaab751",
      "parents": [
        "f4f04d9fa8fda995974c9214eee42c3ea68b1125"
      ],
      "author": {
        "name": "Matthew Buckett",
        "email": "matthew.buckett@oucs.ox.ac.uk",
        "time": "Sat Jul 11 09:43:47 2009 -0400"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 27 18:05:26 2010 -0700"
      },
      "message": "Allow files to be copied into new folders\n\nChange-Id: I7f169e32be5a4328bb87ce7c2ff4b6529e925126\n"
    },
    {
      "commit": "9452e4ec0941fbee163e35ebdcd6ca6ee7df55cb",
      "tree": "63730cd5665d1a6233c4e0d922a886cbd035cad3",
      "parents": [
        "4c50deea28badb7007fa6b78c187de50eacdd07a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 18:17:46 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Mar 06 19:21:00 2010 -0800"
      },
      "message": "Automatically install Gerrit Code Review\u0027s commit-msg hook\n\nMost users of repo are also using Gerrit Code Review, and will want\nthe commit-msg hook to be automatically installed into their local\nprojects so that Change-Ids are assigned when commits are created,\nnot when they are first uploaded.\n\n(cherry picked from commit a949fa5d202f0a1f812d7630f3e5bf0f02ca4e98\n but squashed with latest hook script from version 2.1.2)\n\nChange-Id: Ie68b2d60ac85d8c2285d2e1e6a4536eb76695547\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "4c50deea28badb7007fa6b78c187de50eacdd07a",
      "tree": "d51d267854493562a0b8a5a6480050319a78a39b",
      "parents": [
        "d63060fc9546e2132d0ad7791beb795906372e86"
      ],
      "author": {
        "name": "Daniel Sandler",
        "email": "dsandler@menace.cam.corp.google.com",
        "time": "Tue Mar 02 15:38:03 2010 -0500"
      },
      "committer": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Thu Mar 04 11:56:38 2010 -0500"
      },
      "message": "Fail sync when encountering \"N commits behind.\"\n\nThis is almost always something the user needs to address\nbefore continuing work, so promoting it to a failure (rather\nthan simply an informational message) seems the right way to\ngo. As a side-effect, repo will now exit with a non-zero\nstatus code in this situation, so pipelines of the form\n`repo sync \u0026\u0026 make` will fail if there are branches that\nare stalled due to uploaded but unmerged patches.\n"
    },
    {
      "commit": "d63060fc9546e2132d0ad7791beb795906372e86",
      "tree": "9b0241a1b609cc1563582e6664e3df27732de3af",
      "parents": [
        "b6ea3bfcc398417b91a4fa5a486324f4d904b022"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Wed Jan 20 10:27:50 2010 -0800"
      },
      "committer": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Wed Jan 20 10:27:50 2010 -0800"
      },
      "message": "Check that we are not overwriting a local repository when syncing.\n\nIf a local git repository exists within the same folder as a new project that\nis added, when the user syncs the repo, the sync will overwrite the local\nfiles under the project\u0027s .git repository with its own symlinks. Make sure\nthat we do not overwrite \u0027normal\u0027 files in repo and throw an error when\nthat happens.\n"
    },
    {
      "commit": "aa4982e4c937d9be0f69c250692839eb98a184e8",
      "tree": "5a86ac62a56f93e8ad3a784686a53e333ebadac3",
      "parents": [
        "9bb1816bdc2c21811ea6a87ba6eb745bdf3c041c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Dec 30 18:38:27 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Dec 30 18:38:27 2009 -0800"
      },
      "message": "sync: Fix split call on malformed email addresses\n\nIf an email address in a commit object contains a space, like a few\nmalformed ones on the Linux kernel, we still want to split only on\nthe first space.\n\nUnfortunately my brain was too damaged by Perl and originally wrote\nthe split asking for 2 results; in Python split\u0027s argument is how\nmany splits to perform.  Here we want only 1 split, to break apart\nthe commit identity from the email address on the same line.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "da88ff4411e02225a6d511666ed82f7f9711a752",
      "tree": "e6f1cfb44f76c703dcef9ef5168360d94f5a22a3",
      "parents": [
        "8135cdc53c8737c242a5ba122491c9308a3407d8"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 03 11:09:12 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 03 11:09:31 2009 -0700"
      },
      "message": "Silence \u0027Current branch %s is up to date\u0027 during sync\n\nWe accidentally introduced this message during 1.6.8 by always\ninvoking `git rebase` when there were no new commits from the\nupstream, but the user had local commits.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fe200eeb520e1b50c00d359ca9e138f6149ce0f2",
      "tree": "9b99437d382d6de77956c1cad57b62aceb41e52a",
      "parents": [
        "078a8b270ff7b8b8c3da5029b1d3ff690fb94cc1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jun 01 15:28:21 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jun 01 15:28:21 2009 -0700"
      },
      "message": "Fix unnecessary self in project.py\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3c8dea1f8d7c4257d080f9f34159cdb2fffb81e6",
      "tree": "2a5e48ce93bc913076034f88f8878e4bfffef4dc",
      "parents": [
        "8ad8a0e61d919e76f521f3124c91bd46fbaa84e2"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 18:38:17 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 18:45:20 2009 -0700"
      },
      "message": "Change project.revision to revisionExpr and revisionId\n\nThe revisionExpr field now holds an expression from the manifest,\nsuch as \"refs/heads/master\", while revisionId holds the current\ncommit-ish SHA-1 of the revisionExpr.  Currently that is only\nfilled in if the manifest points directly to a SHA-1.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "8ad8a0e61d919e76f521f3124c91bd46fbaa84e2",
      "tree": "fba74635a3cab4aecd5f9d7dd8672756db3e67e8",
      "parents": [
        "d1f70d9929ddd2748ccc9c1dd2f9603068e1f3e6"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 18:28:25 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 18:45:17 2009 -0700"
      },
      "message": "Change DWIMery hack for dealing with rewound remote branch\n\nThe trick of looking at the reflog for the remote tracking branch\nand only going back one commit works some of the time, but not all of\nthe time.  Its sort of relying on the fact that the user didn\u0027t use\n`repo sync -n` or `git fetch` to only update the tracking branches\nand skip the working directory update.\n\nDoing this right requires looking through the history of the SHA-1\nsource (what the upstream used to be) and finding a spot where the\nDAG diveraged away suddenly, and consider that to be the rewind\npoint.  That\u0027s really difficult to do, as we don\u0027t have a clear\npicture of what that old point was.\n\nA close approximation is to list all of the commits that are in\nHEAD, but not the new upstream, and rebase all of those where the\ncommitter email address is this user\u0027s email address.  In most cases,\nthis will effectively rebase only the user\u0027s new original work.\n\nIf the user is the project maintainer and rewound the branch\nthemselves, and they don\u0027t want all of the commits they have created\nto be rebased onto the new upstream, they should handle the rebase\non their own, after the sync is complete.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d1f70d9929ddd2748ccc9c1dd2f9603068e1f3e6",
      "tree": "746fa0d1ace702f114357d1798bc67eddd1b79a9",
      "parents": [
        "c8a300f6397dad7db00c3654ff6e50e9519ed7c9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 14:58:02 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 09:31:28 2009 -0700"
      },
      "message": "Refactor how projects parse remotes so it can be replaced\n\nWe now feed Project a RemoteSpec, instead of the Remote directly\nfrom the XmlManifest.  This way the RemoteSpec already has the\nfull project URL, rather than just the base, permitting other\ntypes of manifests to produce the URL in their own style.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "242b52690d327a77e47140509085f406155c5722",
      "tree": "92b58b51e6f0b38bea6cc98a0c67604c5d08b7f1",
      "parents": [
        "4cc70ce501321733a1b389e685e964d34b3b4cf5"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:00:29 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:01:52 2009 -0700"
      },
      "message": "Remove support for the extra \u003cremote\u003e definitions in manifests\n\nThese aren\u0027t that widely used, and actually make it difficult for\nusers to fully mirror a forest of repositories, and then permit\nsomeone else to clone off that forest, rather then the original\nupstream servers.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "bc7ef67d9bfcebe17c89eb57cb465d0d6d1d999d",
      "tree": "f5cb5e47c6d5ad8bc2ebfdcdef55df77f62349a9",
      "parents": [
        "2f968c943b1c6f61f867fa9b87105836e0e5f354"
      ],
      "author": {
        "name": "Ficus Kirkpatrick",
        "email": "ficus@android.com",
        "time": "Mon May 04 12:45:11 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 05 15:01:18 2009 -0700"
      },
      "message": "Automatically guess Gerrit change number in \"repo upload --replace\"\n\nThis feature only works if you have one commit to replace right now\n(the common case).\n"
    },
    {
      "commit": "9360966bd2ff68fd7257b50df1a7fcb5e62fe189",
      "tree": "d9e7183ddde5e647ae2a417b278e7c1e90a5379c",
      "parents": [
        "ef9ce1d0a556211687cec6a782de366407255f41"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 10:50:33 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 10:54:59 2009 -0700"
      },
      "message": "Perform copy file activity when creating a new work directory\n\nPerformance improvements in repo sync caused us to skip out of the\ninitial Sync_LocalHalf without ever running CopyFiles, so we didn\u0027t\ncreate the top level Makefile in new clients whose manifest request\none with a \u003ccopyfile\u003e element.\n\nNow we run CopyFiles after the initial read-tree that populates\nthe project working directory.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "05f66b6836ffa4a0a309a4909cb3f8c4a7351727",
      "tree": "9e12c76532af7eebe67d462d215740b5e2953d8c",
      "parents": [
        "eb7af87bcfc67798b58a99422988b9c368d7d642"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:26:32 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:28:06 2009 -0700"
      },
      "message": "Fix \u0027repo sync\u0027 rebase logic on a published branch\n\nIf the current branch is published, but all published commits are\nmerged into the manifest revision, but there is also at least one\nunpublished commit on the current branch, we should rebase the\nunpublished commit, rather than creating a merge commit.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fb2316146f6e3036e0cc3e08653920964a428a15",
      "tree": "f19c5c65a035f547ada03496f1576524e4602665",
      "parents": [
        "8bd5e60b16080008771afcaa7de7084487b84780"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 18:53:46 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 16:50:47 2009 -0700"
      },
      "message": "Automatically use SSH control master support during sync\n\nBy creating a background ssh \"control master\" process which lives\nfor the duration of our sync cycle we can easily cut the time for\na no-op sync of 132 projects from 60s to 18s.\n\nBug: REPO-11\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3d2cdd0ea533e885183ba2952b2bfa05eb1d05ab",
      "tree": "a55b6335c7073432914d5c22b2423f4e08b6f630",
      "parents": [
        "4e3d6739a17dcc9efc5adb1d915be0a886db700e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:26:10 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:26:10 2009 -0700"
      },
      "message": "Highlight projects which still have sync failures during \u0027repo status\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "552ac89929db1794200290550dccdd7f3078d13f",
      "tree": "1da257e391ce65db9ba34fb954ebb9f95a1648ff",
      "parents": [
        "89e717d9481c0c69292a39f85599f5df8277b004"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:15:24 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:15:24 2009 -0700"
      },
      "message": "Modify \u0027repo abandon\u0027 to be more like \u0027repo checkout\u0027 and \u0027repo start\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "89e717d9481c0c69292a39f85599f5df8277b004",
      "tree": "1fc613edd34eb349b673505b872be21a416ab52f",
      "parents": [
        "0f0dfa3930bc16078ef0b1a00ff6849333038fc7"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:04:41 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:04:41 2009 -0700"
      },
      "message": "Improve checkout performance for the common unmodified case\n\nMost projects will have their branch heads matching in all branches,\nso switching between them should be just a matter of updating the\nwork tree\u0027s HEAD symref.  This can be done in pure Python, saving\nquite a bit of time over forking \u0027git checkout\u0027.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0f0dfa3930bc16078ef0b1a00ff6849333038fc7",
      "tree": "e802a68c96d4132199aa2a9d721a56403e0d12d2",
      "parents": [
        "76ca9f8145f367f83df19981da4dd934fdda471b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:53:39 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:53:39 2009 -0700"
      },
      "message": "Add progress meter to \u0027repo start\u0027\n\nThis is mostly useful if the number of projects to switch is many\n(e.g. all of Android) and a large number of them are behind the\ncurrent manifest revision.  We wind up needing to run git just to\nmake the working tree match, and that often makes the command take\na couple of seconds longer than we\u0027d like.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "76ca9f8145f367f83df19981da4dd934fdda471b",
      "tree": "d6c095928fd2b1131972206b3c3f498843a736a6",
      "parents": [
        "accc56d82b902e7c7a22401db710958fcb1c7b58"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:48:03 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:48:03 2009 -0700"
      },
      "message": "Make usage of open safer by setting binary mode and closing fds\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "accc56d82b902e7c7a22401db710958fcb1c7b58",
      "tree": "3c3d233fe188315df9d87ddc247672a92167a3f5",
      "parents": [
        "db45da12089bf131579d100ff7990cbc18d07325"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:45:51 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:45:51 2009 -0700"
      },
      "message": "Speed up \u0027repo start\u0027 by removing some forks\n\nIts quite common for most projects to be matching the current\nmanifest revision, as most developers only modify one or two projects\nat any one time.  We can speed up `repo start foo` (that impacts\nthe entire client) by performing most of the branch creation and\nswitch operations in pure Python, and thus avoid 4 forks per project.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "9bb961785832356ac7f3f2516d4627cc391a2997",
      "tree": "4510ccafe1ffb506680fe5bf47382c6287523120",
      "parents": [
        "f6906876719a665819c603604603570363389d0d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:53:27 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:53:27 2009 -0700"
      },
      "message": "Remove unused methods from project.ReviewableBranch\n\nThese used to be used back when we had Gerrit 1.x support and used\nHTTP based uploads to transmit changes for review.  Since we moved\nentirely to Gerrit 2.x, these are no longer called.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f6906876719a665819c603604603570363389d0d",
      "tree": "a309fe795eff059f5f464fd522fff74af148415b",
      "parents": [
        "336f7bd0ed70f5ee2595463b6bd8dd277e90c833"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:49:00 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:49:00 2009 -0700"
      },
      "message": "Only fetch repo once-per-day under normal \u0027repo sync\u0027 usage\n\nIts unlikely that a new version of repo will be delivered in any\ngiven day, so we now check only once every 24 hours to see if repo\nhas been updated.  This reduces the sync cost, as we no longer need\nto contact the repo distribution servers every time we do a sync.\n\nrepo selfupdate can still be used to force a check.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    }
  ],
  "next": "336f7bd0ed70f5ee2595463b6bd8dd277e90c833"
}
