)]}'
{
  "log": [
    {
      "commit": "0a389e94de32151189b7064d96eaaa0aa6cdb4a3",
      "tree": "526a877b54a070746b7a0ae8b5657baa9e7aed0e",
      "parents": [
        "2675c3f8b5865edff4fe6ec60187b32deef5041d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:21:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:21:18 2009 -0700"
      },
      "message": "Make \u0027repo start\u0027 restartable upon failures\n\nIf `repo start foo` fails due to uncommitted and unmergeable changes\nin a single project, we have switched half of the projects over to\nthe new target branches, but didn\u0027t on the one that failed to move.\n\nThis change improves the situation by doing three things differently:\n\n- We keep going when we encounter an error, so other projects\n  that can successfully switch still switch.\n\n- We ignore projects whose current branch is already on the\n  requested name; they are logically already setup.\n\n- We checkout the branch if it already exists, rather than\n  trying to recreate the branch.\n\nBug: REPO-22\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2675c3f8b5865edff4fe6ec60187b32deef5041d",
      "tree": "cd3f050529425d0fbe89a4dd5eee0d0b15881bc8",
      "parents": [
        "27b07327bc9f4bcda2c29422e064bced092759e3"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:20:25 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:20:25 2009 -0700"
      },
      "message": "Don\u0027t capture stdout during \u0027repo checkout\u0027\n\nThere isn\u0027t any great value in buffering stdout into memory\ncoming from git checkout.  So don\u0027t bother doing it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "27b07327bc9f4bcda2c29422e064bced092759e3",
      "tree": "3eeee2ebd7314a35e9fadb317912791eecb8dbdf",
      "parents": [
        "02d7945eb836f33f63b94fb2a556c844faf0ef8d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:02:48 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:02:48 2009 -0700"
      },
      "message": "Add a repo branches subcommand to describe current branches\n\nWe now display a summary of the available topic branches in this\nclient, based upon a sorted union of all existing projects.\n\nBug: REPO-21\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "02d7945eb836f33f63b94fb2a556c844faf0ef8d",
      "tree": "5cbcbfd147616337aebec9d72b0fd0de3bf34b64",
      "parents": [
        "8f82a4f828c2765cc4585f9d749f5155f06fd9e9"
      ],
      "author": {
        "name": "Wink Saville",
        "email": "wink@google.com",
        "time": "Fri Apr 10 13:01:24 2009 -0700"
      },
      "committer": {
        "name": "Wink Saville",
        "email": "wink@google.com",
        "time": "Fri Apr 10 13:01:24 2009 -0700"
      },
      "message": "Add checkout command.\n\nTeach repo how to checkout a branch in all projects or a list\nof specific projects.\n\nBug: REPO-21\n"
    },
    {
      "commit": "8f82a4f828c2765cc4585f9d749f5155f06fd9e9",
      "tree": "9eb8208cdb0e6f92db491bc9577544904624ed13",
      "parents": [
        "146fe902b7dd4a7758a8748674aa1e5d3cac2592"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Apr 01 07:24:22 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Apr 01 07:24:22 2009 -0700"
      },
      "message": "Don\u0027t start the pager if stdout is a pipe\n\nThe repo script often uses a pager by default and will produce\ncontrol characters (coloring) to standard output when using the\npager, even if the output is redirected to another pipe or script.\nThis is because the pager setup checked for the terminal presence\non FD 0, and in case of redirection FD 0 is still attached to\nthe terminal.\n\nInstead require that both FD 0 and FD 1 are connected to the terminal\nin order to start the pager.\n\nBug: REPO-19, b.android.com/2004\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "146fe902b7dd4a7758a8748674aa1e5d3cac2592",
      "tree": "fdaff71f1d24ff17e97743365b9dc347a05cf765",
      "parents": [
        "722acefdc45a9d335793a79179c56c67f1dfed24"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 14:06:43 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 14:06:43 2009 -0700"
      },
      "message": "Only lookup review server \u0027/ssh_info\u0027 once per repo process\n\nIf the user has multiple projects to upload changes to, and they\nare all going to the same review server, we only need to query the\n\u0027/ssh_info\u0027 data once.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "722acefdc45a9d335793a79179c56c67f1dfed24",
      "tree": "c9a6f60d06383aff200371a571b6cdcf5f416937",
      "parents": [
        "13cc3844d7426d547a718946ecf365330cc0784c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 13:58:14 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 13:58:14 2009 -0700"
      },
      "message": "Produce a useful error if /ssh_info was HTML and not plain text\n\nIf /ssh_info is protected by an HTML based login page, we may get\nback a \"200 OK\" response from the server with some HTML document\nasking us to authenticate.  This can\u0027t be parsed into a host name\nand port number, so we shouldn\u0027t even try.\n\nValid host names and decimal port numbers cannot contain \u0027\u003c\u0027, but\nan unexpected HTML login page would.  So we test for \u0027\u003c\u0027 to give\nus a fair indicator that the content isn\u0027t what we think it is,\nand bail out.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "13cc3844d7426d547a718946ecf365330cc0784c",
      "tree": "c68fbaacd9bc707f35a1b3fc3b87afa59771daa4",
      "parents": [
        "feabbdb44064888a6f0f1bf8bd0049f7162206c9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 13:54:54 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 13:54:54 2009 -0700"
      },
      "message": "Handle review URLs pointing directly at Gerrit\n\nIf a review URL is set to \u0027http://host/Gerrit\u0027 because the user\nthinks that is the correct way to point repo at Gerrit, we should\nbe a bit more flexible and fix the URL by dropping the \u0027/Gerrit\u0027\nsuffix and replace it with \u0027/ssh_info\u0027.\n\nLikewise, if a review URL points already at \u0027/ssh_info\u0027 for a Gerrit\ninstance, we should leave it alone.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "feabbdb44064888a6f0f1bf8bd0049f7162206c9",
      "tree": "1f2ad8484526f1bb382dfba8d94b9a449b8a1616",
      "parents": [
        "8630f39dba4de00345c130e34e98859df169c97a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 19 10:20:27 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 19 10:20:27 2009 -0700"
      },
      "message": "Don\u0027t bother listing branch URLs during upload\n\nModern Gerrit2 automatically outputs the URL for each commit to\nstderr as it creates the records.  Dumping the URL ourselves is\nunnecessary additional output, and worse is just an approximate\nguess for the correct web URL.  Gerrit might not live at the top\nlevel directory for the server, or might even prefer a different\nhostname for web connections than what is listed in the manifest.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "8630f39dba4de00345c130e34e98859df169c97a",
      "tree": "c2631975b9977e02004647f1c740974db82aafe8",
      "parents": [
        "df01883f9b09adcd13f42971a102812f1148408e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 19 10:17:12 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 19 10:17:12 2009 -0700"
      },
      "message": "Fix repo re-init in a mirror to not prompt\n\nOn a mirror client we don\u0027t prompt for user.name,user.email as the\ndata is only necessary if you will make new commits.  On a re-init\nwe were testing the command line option, not the existing IsMirror\nproperty from the manifest configuration file.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "df01883f9b09adcd13f42971a102812f1148408e",
      "tree": "591048750e348501010490b986116132ee564825",
      "parents": [
        "1fc99f4e472c86915cb1affd5507140277711227"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:15:27 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:15:27 2009 -0700"
      },
      "message": "Allow repo init to restart if URL was initially invalid\n\nThis allows the user to run \"repo init -u\" again after an\ninitial attempt failed due to an invalid URL.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1fc99f4e472c86915cb1affd5507140277711227",
      "tree": "f369f77f27b2ef5bc599fad3e801906b7419180d",
      "parents": [
        "1775dbe176fe284a9baa8697f600f03e9b8dabbc"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:06:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:11:51 2009 -0700"
      },
      "message": "Give a more friendly error in \u0027repo init\u0027 if manifest url is invalid\n\nInstead of a stack trace ending in origin/master not existing we\nnow tell the user the manifest url is invalid if \u0027git fetch\u0027 has\nfailed out early.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1775dbe176fe284a9baa8697f600f03e9b8dabbc",
      "tree": "eaeef4183455a6c7d2324d86046368e952dda33e",
      "parents": [
        "521cd3ce67a3621dbbad906f8402dbde8a1e9e63"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:03:04 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:03:04 2009 -0700"
      },
      "message": "Set forall environment variables to empty string if None\n\nIf the value obtained is None we now set the variable to\n\u0027\u0027 instead, in an attempt to make execve() happier about\nour 3rd argument, the env dictionary.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "521cd3ce67a3621dbbad906f8402dbde8a1e9e63",
      "tree": "4ea6d321126983da8633f4832102986bab2d598b",
      "parents": [
        "5470df6219fd3be675b8700c326713e700847a10"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:53:20 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:53:20 2009 -0700"
      },
      "message": "Support \"repo init -b foo \u0026\u0026 repo sync\" to switch baselines\n\nWe now correctly support re-initializing an existing client to point\nto a different branch of the same manifest repository, effectively\nallowing the client to switch the baseline it is operating on.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "5470df6219fd3be675b8700c326713e700847a10",
      "tree": "3f327a5e7ccf8da49ac54f9b24514b61b37c2b2b",
      "parents": [
        "0ed2bd1d95fb85dac1721f4c71abc8e07ec30e64"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:51:58 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:51:58 2009 -0700"
      },
      "message": "Don\u0027t permit \"repo init --mirror\" in an existing client\n\nSimply setting repo.mirror true doesn\u0027t make a client into a mirror.\nThe on-disk layout is completely wrong for a mirror repository,\nand until we fix our layout for a non-mirror client to more closely\nresemble the upstream we can\u0027t do anything to easily turn on or\nturn off the mirror status flag.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0ed2bd1d95fb85dac1721f4c71abc8e07ec30e64",
      "tree": "d6ac77f59b42c493f92156d697e56d481d8c6cae",
      "parents": [
        "c7a4eefa7e775b64916a66b52ca6c5f31e2cf5c8"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:26:31 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:26:31 2009 -0700"
      },
      "message": "Add global --trace command line option\n\nThis has the same effect as saying \"export REPO_TRACE\u003d1\" in\nyour shell prior to starting repo, but is documented in the\ncommand usage and perhaps easier to use.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c7a4eefa7e775b64916a66b52ca6c5f31e2cf5c8",
      "tree": "49451ef2767128c809e48f980766c1a02d6504aa",
      "parents": [
        "43c3d9ea17f1436a6b3b2e7e7827da6f48a21da9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 05 10:32:38 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 05 10:32:38 2009 -0800"
      },
      "message": "Add repo manifest -o to save a manifest\n\nThis can be useful to create a new manifest from an existing client,\nespecially if the client wants to use the \"-r\" option to set each\nproject\u0027s revision to the current commit SHA-1, making a sort of a\ntag file that can be used to recreate this exact state elsewhere.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "43c3d9ea17f1436a6b3b2e7e7827da6f48a21da9",
      "tree": "9bfa77f57095fcd04901ee7783c78d49afdb1e9d",
      "parents": [
        "4259b8a2ac0dddb54e98e00afc454bf966d4f058"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:26:50 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:26:50 2009 -0800"
      },
      "message": "Add a \u0027repo manifest\u0027 command whose help is the manifest file format\n\nThis should make it easier for users to discover the file format\non their own, and read about it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "4259b8a2ac0dddb54e98e00afc454bf966d4f058",
      "tree": "dacf06da9c8e72e897703fe32f07e065b26e8b26",
      "parents": [
        "2816d4f387042b5ee38b27f1c9ef0b3f313165ed"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:03:16 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:03:16 2009 -0800"
      },
      "message": "Tell users how to see the complete list of commands\n\nUsing \"repo help --all\" may not be obvious.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2816d4f387042b5ee38b27f1c9ef0b3f313165ed",
      "tree": "12018b67cf103521128597628beee1b7580e8250",
      "parents": [
        "44469464d2e4ddbb217f92e962ff85dfd736772e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:53:18 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:53:18 2009 -0800"
      },
      "message": "Set core.bare to true on mirror repositories\n\nWhen creating a mirror repository we will always be using a bare\nrepository.  Setting $GIT_DIR/config to have core.bare \u003d true is\nreasonable and helps Git to recognize the environment it is in.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "44469464d2e4ddbb217f92e962ff85dfd736772e",
      "tree": "d699677e5583ee7b193f1c868bba43285fcbe61f",
      "parents": [
        "c95583bf4f17b8467f815b6391ffc6c7add08804"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:51:01 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:51:01 2009 -0800"
      },
      "message": "Allow repo forall -c on a mirror by using GIT_DIR as pwd\n\nWe can permit a forall on a mirror, but only if we put\nthe command into the git repository.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c95583bf4f17b8467f815b6391ffc6c7add08804",
      "tree": "c69bf8a061279b79326fb00f2197efcd8726864c",
      "parents": [
        "6a5644d392069b67f17c8ce6cb10f07cce71cc1c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:47:06 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:47:06 2009 -0800"
      },
      "message": "Don\u0027t permit users to run repo status in a mirror client\n\nIf a client was created with \"repo init --mirror\" then there are\nno working directories present, and no files checked out.  Using\na command like \"repo status\" in this context makes no sense, and\nactually throws back a Pytyon traceback at the console when the\nunderlying commands fail out.\n\nWe now tag commands with the MirrorSafeCommand type if they are\nable to be executed within a mirror directory safely.  Using a\ncommand in a mirror which lacks this base class results in a\nuseful error letting you know the command isn\u0027t supported.\n\nBug: REPO-14\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "6a5644d392069b67f17c8ce6cb10f07cce71cc1c",
      "tree": "e53999c93913da0558d4c247e5bb726a6c02ce2f",
      "parents": [
        "fe0867595635b0dc007088053c5901331ac92536"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 13:52:20 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 13:52:20 2009 -0800"
      },
      "message": "Get rid of the horrible android import work around hack\n\nMonths ago when the Android Open Source Project launched we had some\nimport errors that had to be fixed and worked over.  These hacks\nwere here to help users update their clients to newer versions of\nthe imported code.\n\nIts very likely all clients have either been deleted, or have been\nupdated and have the fixed imports.  So we don\u0027t need this hack in\nrepo anymore.\n\nIf a very ancient client still existed, it would need to be created\nfrom scratch anyway, due to the Android cupcake branch merging\ninto master and the manifest changes not being able to be handled\ncorrectly by repo.  A new client wouldn\u0027t have the incorrectly\nimported code in it, and thus wouldn\u0027t need this hack.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fe0867595635b0dc007088053c5901331ac92536",
      "tree": "3930f4c4b92da8ab4d82c59791692b189a446d27",
      "parents": [
        "be0e8ac232de862d287927c4d735cf30f040cf42"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 13:49:48 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 13:49:48 2009 -0800"
      },
      "message": "Fix repo status when there are renamed/copied files\n\nI missed a parameter in the format string, but still provided the\nvalue in the parameter list, so the format failed to produce an\noutput message.\n\nBug: REPO-15\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "be0e8ac232de862d287927c4d735cf30f040cf42",
      "tree": "bd967fd652ed0da2cd967a66fe5f239780d61120",
      "parents": [
        "47c1a63a07ebd67efac00ca9e0d877633aea5881"
      ],
      "author": {
        "name": "Jeff Bailey",
        "email": "jeffbailey@google.com",
        "time": "Wed Jan 21 19:05:15 2009 -0500"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 19:32:28 2009 -0800"
      },
      "message": "Export additional environment variables to repo forall:\n\nREPO_PATH is the path relative the the root of the client.\n\nREPO_REMOTE is the name of the remote system from the manifest.\n\nREPO_LREV is the name of the revision from the manifest, but\ntranslated to something the local repository knows.\n\nREPO_RREV is the name of the revision from the manifest.\n\nThis allows us to do commands like:\n\n  repo forall -c \u0027echo \"(cd $REPO_PATH \u0026\u0026 git checkout `git rev-parse HEAD`)\"\u0027\n"
    },
    {
      "commit": "47c1a63a07ebd67efac00ca9e0d877633aea5881",
      "tree": "1d52cf3c114a4389a0ec79102604aa8ca6afdde7",
      "parents": [
        "559b846b17a5b720c1247d07e292150466f27f96"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 18:24:23 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 18:24:23 2009 -0800"
      },
      "message": "Add \u0027repo version\u0027 to describe what code we are running\n\nI meant to have this in here, so clients can more easily report\nwhat version of repo they are running.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "559b846b17a5b720c1247d07e292150466f27f96",
      "tree": "1b0c5ed818859db0ef13b943dc005af4fbdd3289",
      "parents": [
        "7c6c64d463d3baa361ef7bef8ff3149134819c96"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 12:56:08 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 12:56:08 2009 -0800"
      },
      "message": "Report better errors when a project revision is invalid\n\nIf a manifest specifies an invalid revision property, give the\nuser a better error message detaling the problem, instead of an\nugly Python traceback with a strange Git error message.\n\nBug: REPO-2\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "7c6c64d463d3baa361ef7bef8ff3149134819c96",
      "tree": "8cf4a5664c881ec6be67e0ca61a82c84a3a2d707",
      "parents": [
        "3778f9d47e876aa15d3fdcc84ef21ec07c63402e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 12:38:13 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 12:38:45 2009 -0800"
      },
      "message": "Fix repo prune output to sort by branch name\n\nWe didn\u0027t always sort the output.  Now we do.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3778f9d47e876aa15d3fdcc84ef21ec07c63402e",
      "tree": "50567255e8aff349763f0b5740c0a834870acbb8",
      "parents": [
        "993eedf9fabfad3e929a9161d00db4ae7d9c551c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 12:30:50 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 12:38:36 2009 -0800"
      },
      "message": "Fix repo prune to work on git 1.6.1-rc3~5 and later\n\nPrior to git 1.6.1-rc3~5 the output of \u0027git branch -d\u0027 matched:\n\n  Deleted branch (.*)\\.\n\nwhere the subgroup grabbed the branch name. In v1.6.1-rc3~5 (aka\na126ed0a01e265d7f3b2972a34e85636e12e6d34) Brandon Casey changed\nthe output to include the SHA-1 of the branch name, now matching\nthe pattern:\n\n  Deleted branch (.*) \\([0-9a-f]*\\)\\.\n\nInstead of parsing the output of git branch we now re-obtain the\nlist of branches after the deletion attempt and perform a set\ndifference in memory to determine which branches we were able to\nsuccessfully delete.\n\nBug: REPO-9\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "993eedf9fabfad3e929a9161d00db4ae7d9c551c",
      "tree": "e1d1488c3e91a888ea620abf5819e4b7b0c06110",
      "parents": [
        "02e0cdf359c11d9122471c6bde64db07abf19c39",
        "5ab508cbcc2baee6c6bbe4bb9470f60ab47c1758"
      ],
      "author": {
        "name": "Android Code Review",
        "email": "code-review@android.com",
        "time": "Tue Feb 10 11:53:40 2009 -0800"
      },
      "committer": {
        "name": "Android Code Review",
        "email": "code-review@android.com",
        "time": "Tue Feb 10 11:53:40 2009 -0800"
      },
      "message": "Merge"
    },
    {
      "commit": "02e0cdf359c11d9122471c6bde64db07abf19c39",
      "tree": "8364c142a4a51ae3ee96bda237df179cd0c4ebf2",
      "parents": [
        "a8e98a6962727969da9faa12658596c8b1a14baf",
        "370e3fa6660fa2eb675199104cde9e9d02063cfd"
      ],
      "author": {
        "name": "Android Code Review",
        "email": "code-review@android.com",
        "time": "Tue Feb 10 11:53:30 2009 -0800"
      },
      "committer": {
        "name": "Android Code Review",
        "email": "code-review@android.com",
        "time": "Tue Feb 10 11:53:30 2009 -0800"
      },
      "message": "Merge"
    },
    {
      "commit": "a8e98a6962727969da9faa12658596c8b1a14baf",
      "tree": "4666a12620fdc276f619714a88fc32d73bd49919",
      "parents": [
        "b54a392c9a267a06058b663377282c9dcec6878e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Feb 02 16:17:02 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Feb 02 16:17:02 2009 -0800"
      },
      "message": "Fix color parsing to not crash when user defined colors are set\n\nWe didn\u0027t use the right Python string methods to parse colors.\n\n  $ git config --global color.status.added yellow\n\nmanaged to cause a stack trace due to undefined methods trim()\nand lowercase().  Instead use strip() and lower().\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "5ab508cbcc2baee6c6bbe4bb9470f60ab47c1758",
      "tree": "16fdbb282d860975b28c66bce34686dc1ac0d6e4",
      "parents": [
        "370e3fa6660fa2eb675199104cde9e9d02063cfd"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 26 10:56:45 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 26 10:56:45 2009 -0800"
      },
      "message": "Remove the now unnecessary Makefile\n\nIn a pure Python project run directly from source we really don\u0027t\nhave a need for a Makefile.  Previously it held the rule to update\nthe protobuf client from Gerrit1, but now that we have retired that\nlogic we don\u0027t need it anymore.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "370e3fa6660fa2eb675199104cde9e9d02063cfd",
      "tree": "5ff9e8399be3a6ba7db48f20c00c86989634445f",
      "parents": [
        "b54a392c9a267a06058b663377282c9dcec6878e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 26 10:55:39 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 26 10:55:39 2009 -0800"
      },
      "message": "Remove the protobuf based HTTP upload code path\n\nNow that Gerrit2 has been released and the only supported upload\nprotocol is direct git push over SSH we no longer need the large\nand complex protobuf client library, or the upload chunking logic\nin gerrit_upload.py.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b54a392c9a267a06058b663377282c9dcec6878e",
      "tree": "556c81394730f0d52b23a8a79fe302e29b923916",
      "parents": [
        "21f73854006d5e989b5ba6b58e6da198212f2e4b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 05 16:18:58 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 05 16:34:27 2009 -0800"
      },
      "message": "Support Gerrit2\u0027s ssh:// based upload\n\nIn Gerrit2 uploads are sent over \"git push ssh://...\", as this\nis a more efficient transport and is easier to code from external\nscripts and/or direct command line usage by an end-user.\n\nGerrit1\u0027s HTTP POST based format is assumed if the review server\ndoes not have the /ssh_info URL available on it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "21f73854006d5e989b5ba6b58e6da198212f2e4b",
      "tree": "0661ef11c9b258fe73f7e28d779b05119f4e503a",
      "parents": [
        "24d8dfbc34164a502e6b48df0230526097543762"
      ],
      "author": {
        "name": "Marcelo E. Magallon",
        "email": "marcelo.magallon@gmail.com",
        "time": "Wed Dec 31 04:44:37 2008 +0000"
      },
      "committer": {
        "name": "Marcelo E. Magallon",
        "email": "marcelo.magallon@gmail.com",
        "time": "Wed Dec 31 04:45:04 2008 +0000"
      },
      "message": "Remove astray comma\n\nThere\u0027s an extra \",\" at the end of the line, which is causing\ntrouble when the manifest file specifies a revision for a\nproject.  Since the default manifest file doesn\u0027t specify\nrevisions for the projects, the problem has gone unnoticed.\n\nThanks to Barry Silverman \u003cbarry@disus.com\u003e for spotting the\nissue and providing a patch.\n\nSigned-off-by: Marcelo E. Magallon \u003cmarcelo.magallon@gmail.com\u003e\n"
    },
    {
      "commit": "24d8dfbc34164a502e6b48df0230526097543762",
      "tree": "b9b4160a1e5176a4931930c23016977b44d6908c",
      "parents": [
        "a6df7d284cc008cc2f21092f5fdd4e32ed28500e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Dec 18 07:21:32 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Dec 18 07:21:32 2008 -0800"
      },
      "message": "Correct the REPO_URL in the wrapper script to android.git.kernel.org\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a6df7d284cc008cc2f21092f5fdd4e32ed28500e",
      "tree": "b3c0970115668d068c8b34768484b60511fd11aa",
      "parents": [
        "67092448c290ce6bd3f05abc17f4f4d53e4c91bb"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Dec 12 08:04:07 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Dec 12 08:04:07 2008 -0800"
      },
      "message": "Describe upload --replace in upload\u0027s help text\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "67092448c290ce6bd3f05abc17f4f4d53e4c91bb",
      "tree": "bcb2fc65b934d3e6904286bf69fb0b8e2f52b9ea",
      "parents": [
        "e92ceebde0034ad045e12b8241045d701383e681"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Dec 12 08:01:12 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Dec 12 08:01:12 2008 -0800"
      },
      "message": "Don\u0027t accept multiple commits for the same change in upload --replace\n\nGerrit won\u0027t permit more than one commit using the same change\nnumber during a replacement request, so we should error out if\nthe user has asked for this in their upload edit script.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "e92ceebde0034ad045e12b8241045d701383e681",
      "tree": "aa604c3a12d8e7908823a40f877699188f927d15",
      "parents": [
        "03eaf07ec6aa7e99a0444ac1ec708b2a5f7cbbf5"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 24 15:51:25 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 24 15:51:25 2008 -0800"
      },
      "message": "Fix upload --replace after it was broken when --review,--cc was added\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "03eaf07ec6aa7e99a0444ac1ec708b2a5f7cbbf5",
      "tree": "3de33686218f59849912004a4376402082384fff",
      "parents": [
        "2896a79120fe1de65472736f756c47b558b44db1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 20 11:42:22 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 20 11:54:46 2008 -0800"
      },
      "message": "Support \u003cremove-project name\u003d\"X\"\u003e in manifest to remove/replace X\n\nThe manifest files now permit removing a project so the user can\neither keep it out of their client, or replace it with a different\nproject using an entirely different configuration.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2896a79120fe1de65472736f756c47b558b44db1",
      "tree": "73a105ae2e3138575b82e9840a69c8b2eca0dd1e",
      "parents": [
        "8c6eef4713db36a2063dd5a68b3d37a5e4276508"
      ],
      "author": {
        "name": "Joe Onorato",
        "email": "joeo@android.com",
        "time": "Mon Nov 17 16:56:36 2008 -0500"
      },
      "committer": {
        "name": "Joe Onorato",
        "email": "joeo@android.com",
        "time": "Wed Nov 19 11:55:06 2008 -0500"
      },
      "message": "Add --review and --cc flags to repo upload, so you can\nassign reviewers when you upload changes.\n"
    },
    {
      "commit": "8c6eef4713db36a2063dd5a68b3d37a5e4276508",
      "tree": "db9f821a6ba0c6d7e179eec9bc4b599bb01653d4",
      "parents": [
        "34d237fbfbd87e8bb81063c23737e9b1ee4d5679"
      ],
      "author": {
        "name": "Joe Onorato",
        "email": "joeo@android.com",
        "time": "Fri Nov 14 21:12:44 2008 -0500"
      },
      "committer": {
        "name": "Joe Onorato",
        "email": "joeo@android.com",
        "time": "Fri Nov 14 21:12:44 2008 -0500"
      },
      "message": "Make repo\u0027s editor work when the editor is a commandline with\nmultiple args.\n"
    },
    {
      "commit": "34d237fbfbd87e8bb81063c23737e9b1ee4d5679",
      "tree": "55266531e2a8a244b0330d71b0aac2690fbe92a7",
      "parents": [
        "c99883fee990a1baa7e0bf5f854c7485b7d0f0d9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Nov 12 18:37:18 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Nov 12 18:37:18 2008 -0800"
      },
      "message": "Paper bag fix repo 1.3\u0027s \"repo upload\" without --replace\n\nIf we aren\u0027t doing a replacement we do not have any\nreplace rules, so we cannot iterate over them.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c99883fee990a1baa7e0bf5f854c7485b7d0f0d9",
      "tree": "870cfd73b1fc2faf53da6d613ae820984695b305",
      "parents": [
        "ec18b4bac4f3c0760c26e83b8ade01ad1c815a9b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 11 17:12:43 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Nov 12 09:12:19 2008 -0800"
      },
      "message": "Teach \u0027repo upload --replace\u0027 how to add replacement patch sets\n\nUsers are prompted with the list of known changes we are about\nto upload, and they can fill out the current change numbers for\nany changes which already exist in the data store.  For each of\nthose changes the change number and commit id is sent as part of\nthe upload request, so Gerrit can insert the new commit as a new\npatch set of the existing change, rather than make a new change.\n\nThis facility permits developers to replace a patch so they can\naddress comments made on a prior version of the same change.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ec18b4bac4f3c0760c26e83b8ade01ad1c815a9b",
      "tree": "2519989eea696d3da7a60ec530f2179a02ae0e55",
      "parents": [
        "35f2596c27ae041235b88076888870b8ba2e2c8c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 11 18:45:55 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Nov 12 09:12:19 2008 -0800"
      },
      "message": "Update proto client to support patch set replacments\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "35f2596c27ae041235b88076888870b8ba2e2c8c",
      "tree": "e404e569a49057d44b88c2cfae7f7f817c566326",
      "parents": [
        "5d40e26201ed87ae8276a77e263b8cbe50598703"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 11 17:03:13 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Nov 12 09:12:17 2008 -0800"
      },
      "message": "Refactor part of GetUploadableBranches to lookup one specific branch\n\nThis way project.GetUploadableBranch(project.CurrentBranch) can tell\nus how (if at all) to upload the currently checked out branch.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "5d40e26201ed87ae8276a77e263b8cbe50598703",
      "tree": "3130b4b5db0466e07ed9fa4e7bb2383dc91954f6",
      "parents": [
        "70939e2f73bf118c89cf4af4988dba807c50a0ce"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 11:07:42 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 11:23:27 2008 -0800"
      },
      "message": "Treat missing attributes as None when parsing the manifest\n\nSome of our code assumes that a property is None.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "70939e2f73bf118c89cf4af4988dba807c50a0ce",
      "tree": "b1849b9a48572876b35cd621192cbb4c712e816e",
      "parents": [
        "ae6e0949d187c35d79dbc0b21788fdbb2c65bf78"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 11:07:14 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 11:23:08 2008 -0800"
      },
      "message": "Add \u003cadd-remote to-project\u003d\"...\"\u003e to inject additional remotes\n\nThis way users can add forks they know about to an existing project\nthat was already declared in the primary manifest.  This is mostly\nuseful with the Linux kernel project, where multiple forks is quite\ncommon for the main upstream tree (e.g. Linus\u0027 tree), a platform\narchitecture tree (e.g. ARM) and a device specific tree (e.g. the\nmsm7k tree used by Android).\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ae6e0949d187c35d79dbc0b21788fdbb2c65bf78",
      "tree": "7a825c0e8cb24f0df512f62f4e44970026641dda",
      "parents": [
        "339ba9f6f70b1733f89a5ff89d5f155389a04094"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 10:25:35 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 11:23:06 2008 -0800"
      },
      "message": "Add \u003cremote project-name\u003d\"...\"\u003e attribute within projects\n\nBy setting a project-name on a remote nested within a project forks\nof a project like the Linux kernel can be easily handled by fetching\nall relevant forks into the same client side project under different\nremote names.  Developers can create branches off different remotes\nusing `git checkout --track -b $myname $remote/$branch` and later\n`repo upload` automatically redirects to the proper fork project\nin the code review server.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "339ba9f6f70b1733f89a5ff89d5f155389a04094",
      "tree": "be37abf6ef01588a1c894513a6febb651642b8db",
      "parents": [
        "70cd4ab2708eaae7d96d7e8b0a3f88850c163543"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 09:52:51 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 09:52:51 2008 -0800"
      },
      "message": "Use remote.*.projectname to indicate the target project for upload\n\nThis way \"forks\" of a project, e.g. the linux kernel, can be setup to\nuse different destination projects in the review server by creating\ndifferent remotes in the client side Git repository.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "70cd4ab2708eaae7d96d7e8b0a3f88850c163543",
      "tree": "fe973a5bbed05d4fb81019a3c43f7660ff89bc2b",
      "parents": [
        "e284ad1d1a2c6fa0e0ac800e87b2607f9bda339e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 08:48:44 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 08:48:44 2008 -0800"
      },
      "message": "Add some short documentation about the local manifest\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "e284ad1d1a2c6fa0e0ac800e87b2607f9bda339e",
      "tree": "fcf35ac784ec2e13c78ee3882ccb1fec0ad3d049",
      "parents": [
        "3e5481999d5f853e19ee5caaaaa968fc4b5176ab"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 07:37:10 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Nov 05 18:08:32 2008 -0800"
      },
      "message": "Add \u0027repo init --mirror\u0027 to download a complete forrest\n\nThe mirror option downloads a complete forrest (as described by the\nmanifest) and creates a replica of the remote repositories rather\nthan a client working directory.  This permits other clients to\nsync off the mirror site.\n\nA mirror can be positioned in a \"DMZ\", where the mirror executes\n\"repo sync\" to obtain changes from the external upstream and\nclients inside the protected zone operate off the mirror only,\nand therefore do not require direct git:// access to the external\nupstream repositories.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3e5481999d5f853e19ee5caaaaa968fc4b5176ab",
      "tree": "fd6c97f1abd78525dc26b4eb2b8bc12027b7f93b",
      "parents": [
        "d3c388391e11aff0b26ecf19c8cb668a9629ef5a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 11:19:36 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 11:19:36 2008 -0800"
      },
      "message": "Add a basic outline of the repo manifest file format\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d3c388391e11aff0b26ecf19c8cb668a9629ef5a",
      "tree": "0b25adaa167e99f06fd38e1da8dea82c65252ae7",
      "parents": [
        "2450a2987afcf3d01a4d43fffe590b02880d9aa7"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 10:40:43 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 10:49:04 2008 -0800"
      },
      "message": "Update proto_client to notify the user when auth cookies are accessed\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2450a2987afcf3d01a4d43fffe590b02880d9aa7",
      "tree": "adcfcf649c387da978bc1ddf22f0883ce984c679",
      "parents": [
        "f5c25a68d832f7eed55f939f97098071b20f753a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 08:22:07 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 09:45:59 2008 -0800"
      },
      "message": "Assume the manifest branch matches the branch name in Git\n\nWhatever branch name we checked the manifest out from is the name\nwe want to reflect throughout the rest of the projects, e.g. within\nthe special \"m/\" remote space.\n\nThis reduces the difference between different branches within the\nmanifest file.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f5c25a68d832f7eed55f939f97098071b20f753a",
      "tree": "981c72da9567548971a71e8b85d39b4ecfabb6a8",
      "parents": [
        "9fa44db94bfabcf43160316660801a2c1db2dbb9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 08:11:53 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 09:45:59 2008 -0800"
      },
      "message": "Cleanup stale manifest migration code from manifest.py\n\nPrior to open-sourcing repo we had manifests in two different\nlayouts; one where the manifest was a straight-up git clone, and\none where the manifest was our bare repository with symlink work\ntree format (identical to what our projects use).  Only the latter\nform is created or used by repo at this point, so the transition\ncode to handle the straight-up git clone is not necessary.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "9fa44db94bfabcf43160316660801a2c1db2dbb9",
      "tree": "4a8ffcba60cfd6c02e88c9f401a66d4cab1b18b0",
      "parents": [
        "c9ef744c7b5f6bcab446cf0a0bc9cc1b016dd5f8"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 03 11:24:59 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 03 11:24:59 2008 -0800"
      },
      "message": "Introduce \u0027repo abandon \u003cbranchname\u003e\u0027 as an alias for \u0027git branch -D\u0027\n\nThis destroys a local development branch, removing all history\nof that branch from ever existing.  If the branch is currently\nchecked out we move back to the upstream revision.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c9ef744c7b5f6bcab446cf0a0bc9cc1b016dd5f8",
      "tree": "ff1bd7309698ef0dd312daf205512b1fa96d3e8d",
      "parents": [
        "438ee1cad98ac32509718976e63c36a449bfb679"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 03 10:32:09 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 03 11:00:44 2008 -0800"
      },
      "message": "Install a default pre-auto-gc hook in all repositories\n\nThis hook is evaluated by `git gc --auto` to determine if it is a\ngood idea to execute a GC at this time, or defer it to some later\ndate.  When working on a laptop its a good idea to avoid GC if you\nare on battery power as the extra CPU and disk IO would consume a\ndecent amount of the charge.\n\nThe hook is the standard sample hook from git.git contrib/hooks,\nlast modified in git.git by 84ed4c5d117d72f02cc918e413b9861a9d2846d7.\nI added the GPLv2 header to the script to ensure the license notice\nis clear, as it does not match repo\u0027s own APLv2 license.\n\nWe only update hooks during initial repository creation or on\na repo sync.  This way we don\u0027t incur huge overheads from the\nhook stat operations during \"repo status\" or even the normal\n\"repo sync\" cases.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "438ee1cad98ac32509718976e63c36a449bfb679",
      "tree": "9627a7fc84e5aab01a2ece8eae6c0ac045e20a46",
      "parents": [
        "23d7781c0bac53b24f4598104e8ba38310e8d100"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 03 09:59:36 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 03 09:59:36 2008 -0800"
      },
      "message": "Catch symlink creation failures and report a better error\n\nSome users have noticed that repo doesn\u0027t work on VFAT, as we\nrequire a POSIX filesystem with POSIX symlink support.  Catching the\nOSError during our symlink creation and raising a GitError with a\nmore descriptive message will help users to troubleshoot and fix\ntheir own installation problems.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "23d7781c0bac53b24f4598104e8ba38310e8d100",
      "tree": "b3b7f729746c96225f12177c111b3429f2da86a4",
      "parents": [
        "a54c527ae941a3bbf8b3ec54249ab12c3d6bf78b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 30 11:06:57 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 30 11:06:57 2008 -0700"
      },
      "message": "Don\u0027t print \"Already up-to-date\" during repo sync\n\nIf we are already up-to-date we just want to display no output.\nThis means we have to avoid calling \"git merge\" if there aren\u0027t\ncommits to be merged into the working directory.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a54c527ae941a3bbf8b3ec54249ab12c3d6bf78b",
      "tree": "ed70807cabe8bd010277cd0a1d976a3d726f5f70",
      "parents": [
        "df830f12389984adeeba04659615b9fc230f2db3"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 30 11:03:00 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 30 11:03:00 2008 -0700"
      },
      "message": "Fast-forward a fully merged topic branch during \u0027repo sync\u0027\n\nInstead of trying to rebase the changes on a topic branch that\nhas been fully merged into the upstream branch we track, we should\njust fast-forward the topic branch to the new upstream revision.\nThis way the branch doesn\u0027t try to rewrite commits that are already\nmerged in the upstream.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "df830f12389984adeeba04659615b9fc230f2db3",
      "tree": "ea5857656f63f9b375dbb9851e8801062570c24d",
      "parents": [
        "90be5c0839762d14bdee75d121c3923ed91c8404"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 30 09:21:43 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 30 09:21:43 2008 -0700"
      },
      "message": "Remove import_tar, import_zip and the \u003csnapshot\u003e elements\n\nNow that repo relies only on the git data stream (as it is much\nfaster to download through) we don\u0027t really need to be parsing the\n\u003csnapshot\u003e elements within manifest.  Its a lot of complex code to\nconvert the tar (or zip) through to a fast import stream, and we\njust aren\u0027t calling it anymore.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "90be5c0839762d14bdee75d121c3923ed91c8404",
      "tree": "9b7381e33f3cf311919f5372c2a34f6a1f337854",
      "parents": [
        "7965f9fed083f07255d62f2a4a49fb54424356e4"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 29 15:21:24 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 29 15:24:34 2008 -0700"
      },
      "message": "Cache the per-user configuration to avoid duplicate instances\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "7965f9fed083f07255d62f2a4a49fb54424356e4",
      "tree": "60b0eff346743da51bf3f4952bd40623e046c362",
      "parents": [
        "de646819b8e43a906d86a579c68118cad31934cc"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 29 15:20:02 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 29 15:24:34 2008 -0700"
      },
      "message": "Move the Editor configuration out of Manifest\u0027s constructor\n\nThis way we can build more than one Manifest instance in memory\nand not muck around with the Editor configuration each time we\nbuild a new instance.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "de646819b8e43a906d86a579c68118cad31934cc",
      "tree": "2133f50781f6849d3f8de8ae3a95b5a6c1853063",
      "parents": [
        "bd4edc9a6996d666edfa77b6b80615ee7c8ea335"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 29 14:38:12 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 29 14:38:12 2008 -0700"
      },
      "message": "Don\u0027t flip out if there are no template hooks\n\nGit may have been installed without its hooks directory, which\nmeans we won\u0027t have any hooks in a repo created git repository.\nSince we are just deleting the hooks it doesn\u0027t matter.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "bd4edc9a6996d666edfa77b6b80615ee7c8ea335",
      "tree": "fa78fbf11c1b9a44710dafeda73a740e8be7f583",
      "parents": [
        "ce03a401c6fb5a890a3fbf03ab51f70a80370ec1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 16:14:05 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 16:14:05 2008 -0700"
      },
      "message": "Stop downloading snapshots as native git:// is faster\n\nDownloading and streaming a tar into Git is slower than just\nletting the native git:// protocol handle the data transfer,\nespecially when there are multiple revisions available and\nGit can perform delta compression across revisions.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ce03a401c6fb5a890a3fbf03ab51f70a80370ec1",
      "tree": "c575afd365420dda631581dd3efc7a588a8c37a6",
      "parents": [
        "45476c40c7300efe09ee376a8f1bf4488bd25afa"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 16:12:03 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 16:12:03 2008 -0700"
      },
      "message": "Stop hiding remote missing object errors\n\nHiding error messages from the remote peer is not a good idea,\nas users should be made aware when the remote peer is not a\ncomplete Git repository so they can alert the administrators\nand have the repository corrected.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "45476c40c7300efe09ee376a8f1bf4488bd25afa",
      "tree": "95bfbb9ad38b514145507f6aa59d9a6cdf11e7f8",
      "parents": [
        "16191347205deab1bb255b8395cb72419793210d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 08:46:15 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 08:46:15 2008 -0700"
      },
      "message": "wrapper 1.6\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "16191347205deab1bb255b8395cb72419793210d",
      "tree": "29763cd7c84fdb1058b82f3250ef27120f890b3a",
      "parents": [
        "7efd1a5b231d70fc8c1d0986e896e9accb7a22a0"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 08:33:34 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 08:44:18 2008 -0700"
      },
      "message": "Added missing wait after git-version call in wrapper\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "7efd1a5b231d70fc8c1d0986e896e9accb7a22a0",
      "tree": "601b2deadbc8c59fe310bc18a22ab802fb3e873c",
      "parents": [
        "329c31da7d03b5fd0d68f3ca39a7ff82c600d12b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 08:31:03 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 28 08:44:18 2008 -0700"
      },
      "message": "Remove unused import from gerrit_upload.py\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "329c31da7d03b5fd0d68f3ca39a7ff82c600d12b",
      "tree": "ca6a34b7ac71d5fdbf70aa4a7fdb34315f5a2751",
      "parents": [
        "5cc6679fb84ec887a09895c53a279df821faad49"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 24 09:17:25 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 24 09:17:25 2008 -0700"
      },
      "message": "Repair any mis-directed android-1.0 annotated tags\n\nThe initial open source release of the Android 1.0 platform had\nsome problems with its Perforce-\u003eGit imports.  Google was forced\nto rewrite some history to redirect users onto more stable upstream\nsources and correct errors in the imports.\n\nNot everyone has the correct android-1.0 tags, as some users did\nmanage to fetch the platform early, before the mirror sites crashed\nand the history was rewritten.\n\nThis change is a band-aid to ensure any stale android-1.0 tags are\nget updated to the corrected version.  It should be backed out at\nsome point in the near future, when we can be fairly certain that\neveryone has the correct android-1.0 tags.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "5cc6679fb84ec887a09895c53a279df821faad49",
      "tree": "36c80f9302586c639385084d1970f982b1434006",
      "parents": [
        "632768bc65ae0f1dc9eb9260c9146c42d9965a18"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 23 16:19:27 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 23 16:20:14 2008 -0700"
      },
      "message": "Support user supplied custom .repo/local_manifest.xml files\n\nBy creating a .repo/local_manifest.xml the user can add extra\nprojects into their client space, without touching the main\nmanifest script.\n\nFor example:\n\n  $ cat .repo/local_manifest.xml\n  \u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e\n  \u003cmanifest\u003e\n   \u003cproject path\u003d\"android-build\"\n            name\u003d\"platform/build\"\n            remote\u003d\"korg\"\n            revision\u003d\"android-1.0\" /\u003e\n  \u003c/manifest\u003e\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "632768bc65ae0f1dc9eb9260c9146c42d9965a18",
      "tree": "f8fc564a40e5886c74062d6be751ca4c2769721c",
      "parents": [
        "0758d2f1d61288c83282749d2b36958d2c289e7f"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 23 11:58:52 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 23 14:43:28 2008 -0700"
      },
      "message": "Teach repo how to download changes to the local checkout\n\nNow `repo download . 1402` would download the change numbered 1402\ninto the current project and check it out for the user, using a\ndetached HEAD.  `repo sync .` would back out of the change and\nreturn to the upstream version.\n\nMultiple projects can be fetched at once by listing them out on\nthe command line as different arguments.\n\nIndividual patch sets can be selected by adding a \u0027/n\u0027 to indicate\nthe n-th patch set should be downloaded instead of the default of\npatch set 1.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0758d2f1d61288c83282749d2b36958d2c289e7f",
      "tree": "484a67366aeb84d83147eeec2ba4fd459dbf0879",
      "parents": [
        "bb0ee8057165a9d54e1e1ab9addb15a2a57ccfc1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 22 13:13:40 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 22 13:13:40 2008 -0700"
      },
      "message": "Show which user account each change was uploaded under\n\nThis way users are well aware of which account we used when the\nuploads are complete, so they can be certain to sign into the web\napplication with that user identity.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "bb0ee8057165a9d54e1e1ab9addb15a2a57ccfc1",
      "tree": "65fd7bcf7757f03a6ff52bc71be36128bcc64197",
      "parents": [
        "02dbb6d120e44ec22cc7051251984cfd618e74ce"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 22 13:02:56 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Oct 22 13:10:29 2008 -0700"
      },
      "message": "Change RPC client to only use Google Accounts for authentication\n\nHosted domain account (such as \"@google.com\" itself) don\u0027t work on the\nGoogle App Engine service unless the user specifically creates their\nown Google Account (https://www.google.com/accounts/NewAccount) with\nthe same email address.\n\nWhen both such accounts exist we must *only* use the Google Account in\nour auth request, as that is all Google App Engine will honor when we\nsend it the session cookie.\n\nHowever, Google has internal servers that may also be running Gerrit\nbased applications.  In those case we must use the hosted auth login\nfor @google.com user accounts, as the internal servers honor only the\nhosted account and not the public Google Account database.\n\nIn the future we may need to add other domains to the \"HOSTED\" list\nif other Gerrit instances are setup on hosted domains and locked to\nonly those domain\u0027s user accounts, similar to how a server that is\ninternal to Google would be setup.  Since this is currently not a\nlikely occurrence I\u0027m not worrying about making it configurable at\nthis juncture.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "02dbb6d120e44ec22cc7051251984cfd618e74ce",
      "tree": "e36cde295fc1f3f69eb67cfe6311ae820cd5e5d2",
      "parents": [
        "7542d664de7a9d42f64a81bc8c0b86bcbb384376"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 21 13:59:08 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 21 13:59:08 2008 -0700"
      },
      "message": "Fix StopIteration exception during repo {sync,status}\n\nIf we run out of entries next() will throw StopIteration.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "7542d664de7a9d42f64a81bc8c0b86bcbb384376",
      "tree": "9a991d3c21b9f38cbd08f3c7d5852db0c3db2b5a",
      "parents": [
        "0734600ce0f24016d190311621ea59649bc92bad"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 21 07:11:36 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 21 07:12:42 2008 -0700"
      },
      "message": "Remove the Python 2.4 dependency and use just \u0027python\u0027\n\nMany Linux distributions are including python2.5 by default, as\nit is the latest stable release of the language.  Using python2.4\n(and asking users to specifically install it) is just cruel and\nunusual punishment.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0734600ce0f24016d190311621ea59649bc92bad",
      "tree": "178b43053e592c35f8cddc5e948145b7fd421530",
      "parents": [
        "cf31fe9b4fb650b27e19f5d7ee7297e383660caf"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 21 07:09:27 2008 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 21 07:12:36 2008 -0700"
      },
      "message": "Fix \u0027repo sync\u0027 when the remote reflog has only 1 entry\n\nIf the reflog for the upstream branch has only 1 entry in it, as\nthe branch has been updated only once, we can get back the 0{40}\nobject id from `git rev-parse upstream@{1}`, in which case we should\nconsider it to be the same as if upstream@{1} is not defined.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "cf31fe9b4fb650b27e19f5d7ee7297e383660caf",
      "tree": "d04ca6a45d579dca5e5469606c48c405aee68f4b",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
