)]}'
{
  "log": [
    {
      "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": "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": "6287543e3508fbd3b92c975771c73e11fd4a5977",
      "tree": "ba76a70bf31554c25c1d7b132bd3149aceb5c434",
      "parents": [
        "5566ae5ddea409279b13e538b513a73062862c3e",
        "a6053d54f1178dc527b383844972c6077ee91a4e"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Nov 12 17:30:55 2012 -0800"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Nov 12 17:30:55 2012 -0800"
      },
      "message": "Merge \"Change usages of xrange() to range()\""
    },
    {
      "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": "a6053d54f1178dc527b383844972c6077ee91a4e",
      "tree": "24038d692a1db41c400c9d40da9ac6b5ccfaaa7a",
      "parents": [
        "e072a92a9bb9fdf61bbd1df4e8864f8fd52d5a82"
      ],
      "author": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Thu Nov 01 13:36:50 2012 -0700"
      },
      "committer": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Thu Nov 01 13:36:50 2012 -0700"
      },
      "message": "Change usages of xrange() to range()\n\nIn Python3, range() creates a generator rather than a list.\n\nNone of the parameters in the ranges changed looked large enough\nto create an impact in memory in Python2.  Note: the only use of\nrange() was for iteration and did not need to be changed.\n\nThis is part of a series of changes to introduce Python3 support.\n\nChange-Id: I50b665f9296ea160a5076c71f36a65f76e47029f\n"
    },
    {
      "commit": "1f7627fd3ccab0fbab88ad2d082b67f5719af92c",
      "tree": "3c03eb8efbdc001472f09fa31cf11bf1d2ec01c5",
      "parents": [
        "1d947b30342163b723c96db563967323535fef45"
      ],
      "author": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Wed Oct 31 09:21:55 2012 -0700"
      },
      "committer": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Wed Oct 31 14:26:48 2012 -0700"
      },
      "message": "Use python3 urllib when urllib2 not available\n\nThis is part of a series of changes to introduce Python3 support.\n\nChange-Id: I605b145791053c1f2d7bf3c907c5a68649b21d12\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": "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": "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": "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": "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": "1a68dc58ebc03d58d063235f19282988a2846e63",
      "tree": "c8a13c72278a5a247cb28d13545c15dd3dd879a5",
      "parents": [
        "df5ee52050a5b8ea4e0bb69c007dac556c18ec03"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 14:12:46 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 14:12:46 2011 -0700"
      },
      "message": "upload: Honor REPO_HOST_PORT_INFO environment variable\n\nREPO_HOST_PORT_INFO can be set to \u0027host:port\u0027 and be used\ninstead of the review URL given in the manifest.\n\nChange-Id: I440bdecb2c2249fe5285ec5d0c28a937b4053450\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": "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": "13111b4e97d8cccdba5da974de0996994c64c7e5",
      "tree": "817de88a6a4cc406dca1dbb93cdea4ee34c7f903",
      "parents": [
        "bd0312a4841e9488cf43ae4afb3b58d44eebbbb1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 11:00:31 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 14:52:57 2011 -0700"
      },
      "message": "Add support for url.*.insteadof\n\nTeach repo how to resolve URLs using the url.insteadof feature\nthat C Git natively uses during clone, fetch or push. This will\nlater allow repo to resolve a URL before accessing it directly.\nWe do not want to pre-resolve things and store the resolved URL\ninto individual projects, as this makes it impossible for the\nuser to undo the insteadof mapping at a later date.\n\nChange-Id: I0f62e811197c53fbc8a8be424e3cabf4ed07b4cb\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "014d0609899dba70a1af0b32de377ca08c54aded",
      "tree": "cffe8353d15a9cf3ab03f3c2e8f244570650fbb4",
      "parents": [
        "44da16e8a0e919c60a6eb7b5503cf915864d7336"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Sep 11 12:57:15 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Sep 11 13:11:04 2011 -0700"
      },
      "message": "Honor http_proxy variable globally\n\nIf the http_proxy environment variable was set, honor it during\nthe entire repo session for any Python created HTTP connections.\n\nChange-Id: Ib4ae833cb2cdd47ab0126949f6b399d2c142887d\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a101f1c1670c9992c28980a7028dc6c60028af69",
      "tree": "b151941371a98d0d1a6228fb0303ede7e05b0879",
      "parents": [
        "49cd59bc867d5fc29abcdbc4aac9bb7b826b6705"
      ],
      "author": {
        "name": "Anatol Pomozov",
        "email": "anatol.pomozov@gmail.com",
        "time": "Fri Jul 08 13:52:11 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jul 20 07:11:00 2011 -0700"
      },
      "message": "Honor \u0027http_proxy\u0027 environment variable\n\n\u0027repo upload\u0027 makes http request using urllib2 python library.\nUnfortunately this library does not work (by default) in case\nif the user behind a proxy.\n\nThis change adds proxy handler in case if \u0027http_proxy\u0027 environment\nvariable is set.\n\nChange-Id: Ic4176ad733fc21bd5b59661b3eacc2f0a7c3c1ff\n"
    },
    {
      "commit": "f00e0ce556fc22fef180c74a9d78f1908d9aeb0b",
      "tree": "7ad50d7511c963ec7daae4017849db7b0a06e089",
      "parents": [
        "1b5a4a0c5de5fdaa4f8907357a0aa80e365dd199"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 18:39:49 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:22 2011 -0800"
      },
      "message": "upload: Catch and cleanly report connectivity errors\n\nInstead of giving a Python backtrace when there is a connectivity\nproblem during repo upload, report that we cannot access the host,\nand why, with a halfway decent error message.\n\nBug: REPO-45\nChange-Id: I9a45b387e86e48073a2d99bd6d594c1a7d6d99d4\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n(cherry picked from commit d2dfac81ad6a060179b4b2289060af2dc7a5cdfd)\n"
    },
    {
      "commit": "0048b69c038306fe74408a63cdd0773b0d86a8fe",
      "tree": "ca5fb88b7b5a6a196d066172f4e59f37e626f5cf",
      "parents": [
        "2b8db3ce3e7344b9f3b5216637c5af0d54be5656"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Tue Dec 21 13:39:23 2010 -0800"
      },
      "committer": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Tue Dec 21 13:39:23 2010 -0800"
      },
      "message": "Fixed race condition in \u0027repo sync -jN\u0027 that would open multiple masters.\n\nThis fixes the SSH Control Masters to be managed in a thread-safe\nfashion.  This is important because \"repo sync -jN\" uses threads to\nsync more than one repository at the same time.  The problem didn\u0027t\nshow up earlier because it was masked if all of the threads tried to\nconnect to the same host that was used on the \"repo init\" line.\n"
    },
    {
      "commit": "99482ae58a74e236fb40b65c267163a5690f39e1",
      "tree": "634b25fb07a6e37cafb9c0273bf1a3eb7297ac2f",
      "parents": [
        "ec1df9b7f6310ce5dd9432b727eb9f7bde9f2796"
      ],
      "author": {
        "name": "Ulrik Sjölin",
        "email": "ulrik.sjolin@sonyericsson.com",
        "time": "Fri Oct 29 08:23:30 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 08:25:04 2010 -0700"
      },
      "message": "Only delete corrupt pickle config files if they exist\n\nos.remove() raises OSError if the file being removed doesn\u0027t exist.\nCheck before calling to ensure we don\u0027t raise a useless exception\non an already deleted file.\n\nChange-Id: I44c1c7dd97a47fcab8afb6c18fdf179158b6dab7\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "06d029c1c8c06a6d446b7cc4d5e763ff0754b149",
      "tree": "5d670c3a78fd55db461d99021db13d699c483dcd",
      "parents": [
        "b715b148076ef589e806a98a183c8f4468f75cf6"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Wed Oct 27 17:06:01 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 08:14:56 2010 -0700"
      },
      "message": "Check for existing SSH ControlMaster\n\nBe more thorough about checking for an existing ssh master by\nrunning a test command first, and only opening up a new master\nif the test fails to connect.\n\nChange-Id: I56fe8e7b4dbc123675b7f259e81d359ed0cd55cf\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3575b8f8bdc5f15de23db82499e0ce152f634a19",
      "tree": "d5938307c3a751e36be71653f1d902018dd1198f",
      "parents": [
        "a5ece0e0505324218f38af02a1fe046ca2bcc278"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 17:00:14 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 17:03:19 2010 -0700"
      },
      "message": "upload: Allow review.HOST.username to override email\n\nSome users might need to use a different login name than the local\npart of their email address for their Gerrit Code Review user\naccount.  Allow it to be overridden with the review.HOST.username\nconfiguration variable.\n\nChange-Id: I714469142ac7feadf09fee9c26680c0e09076b75\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "7198572dd7f5b9d95d83733a98691948a3eb9da3",
      "tree": "49b9a3967d575d51b92d44a1c2ce0bb3449faa41",
      "parents": [
        "2daf66740bba0b2726462a547910d16cf0822db2"
      ],
      "author": {
        "name": "Josh Guilfoyle",
        "email": "jasta00@gmail.com",
        "time": "Sun Aug 16 09:44:40 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Jun 08 11:08:11 2010 -0700"
      },
      "message": "Do not invoke ssh with -p argument when no port has been specified.\n\nThis change allows local SSH configuration to choose the port number\nto use when not explicitly set in the manifest.\n\n(cherry picked from commit 4c0f67046543c7c6ab24175e143001f14b76ea01)\n\nChange-Id: Ibea99cfe46b6a2cc27f754cc3944a2fe10f6fda4\n"
    },
    {
      "commit": "ca8c32cd7ae7c3ae27bb6b649eafbfd54d77f916",
      "tree": "20d74c26df2112515313b0b22c7358427bad8b57",
      "parents": [
        "f0a9a1a30e60e92cec9bff4cae030478c276da4d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 11 18:21:33 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 11 18:31:47 2010 -0700"
      },
      "message": "sync: kill git fetch process before SSH control master process\n\nIf the SSH control master process is killed while an active git\nfetch is using its network socket, the underlying SSH client may\nnot realize the connection was broken.  This can lead to both the\nclient and the server waiting indefinitely for network messages\nwhich will never be sent.\n\nWork around the problem by keeping track of any processes that use\nthe tunnels we establish.  If we are about to kill any of the SSH\ncontrol masters that we started, ensure the clients using them are\nsuccessfully killed first.\n\nChange-Id: Ida6c124dcb0c6a26bf7dd69cba2fbdc2ecd5b2fc\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1c85f4e43ba2d337b1e8c49bb3c7814a5cb163ae",
      "tree": "e2f22213eec12b827bf4cfeaf6cf72b6d45f6d8e",
      "parents": [
        "719965af35a2fab96cb578c8a19a48a2cf9fe8e8"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Tue Apr 27 14:35:27 2010 -0700"
      },
      "committer": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Tue Apr 27 14:35:27 2010 -0700"
      },
      "message": "Rename _ssh_sock() to fix code style issue.\n\nSince _ssh_sock is imported out of the git_command module, the leading\nunderscore should be removed from the function name.\n"
    },
    {
      "commit": "b6ea3bfcc398417b91a4fa5a486324f4d904b022",
      "tree": "dc6bc95c3b05ab032a343bbeeee5ac62e917b5da",
      "parents": [
        "aa4982e4c937d9be0f69c250692839eb98a184e8"
      ],
      "author": {
        "name": "Ulrik Sjolin",
        "email": "ulrik.sjolin@gmail.com",
        "time": "Sun Jan 03 18:20:17 2010 +0100"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 04 05:38:39 2010 -0800"
      },
      "message": "Honor url.insteadOf when setting up SSH control master connection\n\nRepo can now properly handle url.insteadOf sections in the\nuser\u0027s ~/.gitconfig file.  This means that a user can now enjoy\nthe master-ssh functionality even if he/she uses insteadOf\u0027s in\n~/.gitconfig to rewrite git:// URLs to ssh:// style URLs.\n\nChange-Id: Ic0f04a9c57206a7b89eb0f10bf188c4c483debe3\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c24c720b6135a8f7975bf9af265124eee2d464cb",
      "tree": "c1460ab9ad60850aed68b25ba6d98a931adc352e",
      "parents": [
        "2d1a3968971366fab7000664959a2d5a39b48996"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 16:12:57 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 16:12:57 2009 -0700"
      },
      "message": "Fix error parsing a non-existant configuration file\n\nIf a file (e.g. ~/.gitconfig) does not exist, we get None\nhere rather than a string.  NoneType lacks rstrip() so we\ncannot strip it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "438c54713a7ca56fba2a7985b6563aa076b17169",
      "tree": "cdb2d8cfd5e05d3659f9b7bc9c5a5191d322df5f",
      "parents": [
        "e020ebee4e3e4e2ddefd72d41ac0035e6d528725"
      ],
      "author": {
        "name": "David Aguilar",
        "email": "davvid@gmail.com",
        "time": "Sun Jun 28 15:09:16 2009 -0700"
      },
      "committer": {
        "name": "David Aguilar",
        "email": "davvid@gmail.com",
        "time": "Mon Jun 29 00:24:36 2009 -0700"
      },
      "message": "git_config: handle configuration entries with no values\n\nA git-config entry with no value was preventing repo\nfrom initializing.  This modifies _ReadGit() to handle\nconfig entries with empty values.\n\nSigned-off-by: David Aguilar \u003cdavvid@gmail.com\u003e\nReported-by: Josh Guilfoyle \u003cjasta00@gmail.com\u003e\n"
    },
    {
      "commit": "fb5c8fd948dea211cd8f43477855de44c273a1bf",
      "tree": "2cce2f23bf0c4c013fca6d3531b59bedf9759621",
      "parents": [
        "26120ca18dd8c2567b0df5a533d52d53c4111bc2"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Jun 16 14:57:46 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Jun 16 14:59:19 2009 -0700"
      },
      "message": "Fix invalid use of try-catch\n\nIts try-except in Python.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "26120ca18dd8c2567b0df5a533d52d53c4111bc2",
      "tree": "08168f9a38f9498fb8abb348204a5bb97dcf1e7c",
      "parents": [
        "7da73d6f3ba579c67e58499b785dc4ac5beb9391"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Jun 16 11:49:10 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Jun 16 11:49:10 2009 -0700"
      },
      "message": "Don\u0027t crash if the ssh client is already dead\n\nIf the SSH client terminated abnormally in the background (e.g. the\nserver shutdown while we were doing a sync) then the pid won\u0027t exist.\nInstead of crashing, ignore it, the result we wanted (a non-orphaned\nssh process) is already acheived.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2a3a81b51f1aee5a2da789d07d14cde61c96e8b7",
      "tree": "83c0e16790ce993efb6be4a8300a2943cecb83ba",
      "parents": [
        "7b4f43542a5dec931f73076d891f8509a69f98e8"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 09:10:07 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 09:10:07 2009 -0700"
      },
      "message": "Ignore EOFError when reading a truncated pickle file\n\nIf the pickle config file is 0 bytes in length,  we may have\ncrashed (or been aborted) while writing the file out to disk.\nInstead of crashing with a backtrace, just treat the file as\nthough it wasn\u0027t present and load off a `git config` fork.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "7b4f43542a5dec931f73076d891f8509a69f98e8",
      "tree": "4eb3da5243a341a3c77969f081bbf87cb8bec99d",
      "parents": [
        "9fb29ce123ad26bf1497144a40e337aff8c51ecb"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 09:06:35 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 09:08:34 2009 -0700"
      },
      "message": "Add missing return False to preconnect\n\nNoticed by users on repo-discuss, we were missing a return False\nhere to signal that SSH control master was not used to setup the\nnetwork connection.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1b34c9118ed86a15b0bc1094804c095dd7be33cb",
      "tree": "ed27e9a6636f99f1c8e917028c52bb060a52179a",
      "parents": [
        "366ad214b82cadc32920b371f7f99f3f6894ec6f"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 21 18:52:49 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 09:31:00 2009 -0700"
      },
      "message": "Allow callers of GitConfig to specify the pickle file path\n\nThis way we can put it in another directory than the config file\nitself, e.g. hide it inside \".git\" when parsing a \".gitmodules\"\nfile from the working tree.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "366ad214b82cadc32920b371f7f99f3f6894ec6f",
      "tree": "c77245ffbd172a5f3a6cc6c41dbe14eb4140e9d5",
      "parents": [
        "242b52690d327a77e47140509085f406155c5722"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 12:47:37 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:02:00 2009 -0700"
      },
      "message": "Teach GitConfig how to yield subsection names\n\nThis can be useful when pulling apart a configuration file, like\nfinding all entries which match submodule.*.*.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2f968c943b1c6f61f867fa9b87105836e0e5f354",
      "tree": "8593b144cfb90a1780ec86591b45039c4c86422f",
      "parents": [
        "2b5b4ac29275ee49184a8aee98f60b744890f5bb"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 30 14:30:28 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 30 14:30:28 2009 -0700"
      },
      "message": "Fix ssh://user@hostname/ style URLs parsing\n\nI only tested this with ssh://hostname/ style URLs, so I failed\nto test ssh://user@hostname/ format, which failed if the hostname\nportion was longer than 1 character.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2b5b4ac29275ee49184a8aee98f60b744890f5bb",
      "tree": "badc77e3f0fc036888766b39386be0e595551472",
      "parents": [
        "6f6cd77a50fd4ffff360d4aee1c6bc05bfb802c1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 23 17:22:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 23 17:22:18 2009 -0700"
      },
      "message": "Disable SSH ControlMaster option on Cygwin\n\nBug: REPO-29\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "896d5dffd313a2ad91fd8bee750241a6512b25dc",
      "tree": "c2f11ce9393b2f27cff759578cad6bb5c7bdf486",
      "parents": [
        "9360966bd2ff68fd7257b50df1a7fcb5e62fe189"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 14:51:04 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 14:51:04 2009 -0700"
      },
      "message": "Fix UnboundLocalError: local variable \u0027port\u0027 when using SSH\n\nIf the SSH URL doesn\u0027t contain a port number, but uses the ssh://\nor git+ssh:// syntax we raised a Python runtime error due to the\n\u0027port\u0027 local variable not being assigned a value.  Default it to\nthe IANA assigned port for SSH, 22.\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": "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": "ad3193a0e587073dee0edef46bdf24f6c6e09779",
      "tree": "84ed1894e6f590455ee361beb049c1c271c4e0e7",
      "parents": [
        "b81ac9e65444d0f54d2b6dd24d20b74945c9a36a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 09:54:51 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 09:54:51 2009 -0700"
      },
      "message": "Fix `repo --trace` to show ref and config loads\n\nThe value of the varible TRACE was copied during the import, which\nhappens before the --trace option can be processed.  So instead we\nnow use a function to determine if the value is set, as the function\ncan be safely copied early during import.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b81ac9e65444d0f54d2b6dd24d20b74945c9a36a",
      "tree": "717c5afa16ee88c9b409ce298c95d6f150118775",
      "parents": [
        "0f3dd233ecaf8d145ddb33a5ef1b8d3d71ade476"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 20:44:26 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:45 2009 -0700"
      },
      "message": "Enable tracing of ref scans and config unpickling\n\nThese are not as expensive as spawning a git command, but they are\nnot free either.  We want to keep track of how many times we wind\nup calling them on any particular operation.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c12c360f89d4d1cc0a0ad80c4ea0785f84be1848",
      "tree": "7e875709a4270e681f7335b7a3171b14b2d8e313",
      "parents": [
        "fbcde472cadfc8319016faca90cb5b57f7a00ee4"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:32 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:45 2009 -0700"
      },
      "message": "Pickle parsed git config files\n\nWe now cache the output of `git config --list` for each of our\nGitConfig instances in a Python pickle file.  These can be read\nback in using only the Python interpreter at a much faster rate\nthan we can fork+exec the git config process.\n\nIf the corresponding git config file has a newer modification\ntimestamp than the pickle file, we delete the pickle file and\nregenerate it.  This ensures that any edits made by the user\nwill be taken into account the next time we consult the file.\n\nThis reduces the time for a no-op repo sync from 0.847s to 0.269s.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f8e3273decd883f334939cb24e542d47aba21a43",
      "tree": "a66cbf8e107ee6914abb2ad1c4fd6a3c54807fe1",
      "parents": [
        "006734b7981289856f71501f3685fd0ee6d27a6d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 11:00:31 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 11:00:31 2009 -0700"
      },
      "message": "Supporrt mixed case subsection names in Git config files\n\nIn the case of:\n\n  [url \"Foo\"]\n    insteadOf \u003d Bar\n\nWe should return \"Bar\" for the key \"url.Foo.insteadof\", but not\nfor the key \"url.foo.insteadof\".  This requires splitting the\nkey into its components and only lower casing the section and\nvalue name, leaving the subsection portion alone.\n\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": "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": "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": "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": "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": "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"
    }
  ]
}
