)]}'
{
  "log": [
    {
      "commit": "3ce2a6b46bb368f000d25782e24d701f68f32659",
      "tree": "0d22b2e9993bd3a378bb9dc56df134c038621397",
      "parents": [
        "841be34968c91c3ea8d8694bc5910e6388f58cbb"
      ],
      "author": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Fri Apr 29 09:59:12 2011 -0400"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 14:38:19 2011 -0800"
      },
      "message": "Propagate result codes from subcmds to sys.exit().\n\nAllows scripts driving repo to know when git failures have\noccurred, not just repo internal errors.\n\nChange-Id: Id20fbbb405c35a148e72c87b822da3f3bf93839c\n"
    },
    {
      "commit": "841be34968c91c3ea8d8694bc5910e6388f58cbb",
      "tree": "cd2b3db593611ecad858e841edae17183458f680",
      "parents": [
        "ee1c2f5717fcc137ab887a4aae8a08d50a539b9a"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Tue Apr 05 11:31:10 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 14:31:56 2011 -0800"
      },
      "message": "Don\u0027t prompt the user for name/email unless necessary\n\nIf the user has already configured a workspace, use these values\nwhen re-running \u0027repo init\u0027.\n\nOtherwise, if the user has global name and e-mail set, use these.\n\nIt\u0027s always possible to override this and be prompted by specifying\n--config-name when running \u0027repo init\u0027.\n\nChange-Id: If45f0e4b14884071439fb02709dc5cb53f070f60\n"
    },
    {
      "commit": "ee1c2f5717fcc137ab887a4aae8a08d50a539b9a",
      "tree": "7a95e6ed8f8b74aac5ba59cbd04e6f24938f2e54",
      "parents": [
        "6a1f73738071e299f600017d99f7252d41b96b4b"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Tue Apr 19 10:50:12 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 14:24:58 2011 -0800"
      },
      "message": "Default repo manifest settings in git config\n\nA default manifest URL can be specified using:\n  git config --global repo-manifest.\u003cid\u003e.url \u003curl\u003e\n\nA default manifest server can be specified using:\n  git config --global repo-manifest.\u003cid\u003e.server \u003curl\u003e\n\nA default git mirror reference can be specified using:\n  git config --global repo-manifest.\u003cid\u003e.reference \u003cpath\u003e\n\nThis will allow the user to use \u0027repo init -u \u003cid\u003e\u0027 as\na shorter alternative to specifying the full URL.\n\nAlso, manifest server will not have to be specified in the\nmanifest XML and the reference will not have to be specified\non the command line. If they are, they will override these\ndefault values however.\n\nChange-Id: Ifdbc160bd5909ec7df9efb0c5d7136f1d9351754\nSigned-off-by: Victor Boivie \u003cvictor.boivie@sonyericsson.com\u003e\n"
    },
    {
      "commit": "6a1f73738071e299f600017d99f7252d41b96b4b",
      "tree": "86ff686f12648b471e153e295c706e0f2a948577",
      "parents": [
        "e9311273dda9aef91c563cd69b30f7a7491c56b5"
      ],
      "author": {
        "name": "Christer Fletcher",
        "email": "christer.fletcher@sonyericsson.com",
        "time": "Thu Apr 28 14:13:14 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 14:01:57 2011 -0800"
      },
      "message": "Added remote destination branch information when uploading.\n\nSeveral times one have done an upload only to later notice in gerrit\nthat the upload was done to the wrong branch as the git has not yet\nbeen branched for the current git. This change will make repo print\nwhat the destination branch is when asking the user if she wants to\ngo through with the upload.\n\nChange-Id: Ia9c3a92a6a04c022edfebf4f8d651ac062bb1f3b\n"
    },
    {
      "commit": "e9311273dda9aef91c563cd69b30f7a7491c56b5",
      "tree": "bb9d6134f3babbc66f0fcace85989c53129b5de9",
      "parents": [
        "605a9a487bba6e25fb48d4e3076c89b7f686517a"
      ],
      "author": {
        "name": "Mike Frysinger",
        "email": "vapier@google.com",
        "time": "Thu Aug 11 15:46:43 2011 -0400"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 12:38:52 2011 -0800"
      },
      "message": "repo: capitalize default prompt char\n\nIt is common in command line tools to indicate what the default answer\nwill be if the user simply hits enter.  In repo, the display is just\n\"y/n\" with no indication as to which is the default.  So change the n\nto N in the messages since that is how repo operates.\n\nChange-Id: I81819ae630355072eb0365e59168b0921289498f\n"
    },
    {
      "commit": "605a9a487bba6e25fb48d4e3076c89b7f686517a",
      "tree": "0c0bf5133e24f319a1d6c61d8237b87469c202b7",
      "parents": [
        "2a32f6afa64c88142a476cd719d29cebacbdfd19"
      ],
      "author": {
        "name": "chenguodong",
        "email": "chenguodong@huawei.com",
        "time": "Mon Aug 22 18:42:47 2011 +0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 12:11:41 2011 -0800"
      },
      "message": "Fixed UnicodeDecodeError while uploading changes.\n\nWhen commit with comment that has non-ASCII characters,\nUnicodeDecodeError will be raised\nwhile uploading multiple project/branch changes.\nBecause some strings in script are not str type, but unicode.\nSo all the strings are decoded to unicode,\nand python use ascii to do this,\nit can not decode non-ASCII characters,\nso UnicodeDecodeError raised.\n\nSigned-off-by: chenguodong \u003cchenguodong@huawei.com\u003e\n\nChange-Id: I46447f489a4b9760a5899c7ba9d764b688594e46\n"
    },
    {
      "commit": "2a32f6afa64c88142a476cd719d29cebacbdfd19",
      "tree": "c268998cae067d7e80b828c68cb78f3bd0809a53",
      "parents": [
        "498fe90b455e896e306498abd24961fd90a21c67"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Tue Aug 30 10:52:33 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 12:09:35 2011 -0800"
      },
      "message": "Fix typo\n\nChange-Id: Idd68ad0a34fcf4bd4e18b0248f50187a539d610a\n"
    },
    {
      "commit": "498fe90b455e896e306498abd24961fd90a21c67",
      "tree": "1f45eba29d25a4751ebd43b6cfe89cf532e492d9",
      "parents": [
        "53d6f4d17e0cb4eabcd604d584a1132a51cc8bf3"
      ],
      "author": {
        "name": "Ulrik Sjölin",
        "email": "ulrik.sjolin@sonyericsson.com",
        "time": "Sun Sep 11 22:59:37 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 29 11:54:58 2011 -0800"
      },
      "message": "Stabilize repo communication with subprocesses.\n\nMake repo use the standard way in python to work with pipes.\nCommunication via pipes to sub processes is done by calling\ncommunicate(). This will make repo not hang every now and\nthen.\n\nChange-Id: Ibe2c4ecbdbcbe72f0b725ca50d54088e5646fc5d\n"
    },
    {
      "commit": "53d6f4d17e0cb4eabcd604d584a1132a51cc8bf3",
      "tree": "c9effdc3a5d890ac55fb8a9f2aa68ac0d500873e",
      "parents": [
        "9d8f914fe8ac75e18e0da2b7ce4886a2ba490fc6"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Thu Aug 25 17:21:47 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 03 13:08:27 2011 -0700"
      },
      "message": "Add a sync flag that fetches only current branch\n\nThere is also shortcuts in case if the \"current branch\" is\na persistent revision such as tag or sha1. We check if the\npersistent revision is present locally and if it does - do\nno fetch anything from the server.\n\nThis greately reduces sync time and size of the on-disk repo\n\nChange-Id: I23c6d95185474ed6e1a03c836a47f489953b99be\n"
    },
    {
      "commit": "9d8f914fe8ac75e18e0da2b7ce4886a2ba490fc6",
      "tree": "ff7fef6ee9840cdb1fb762cbb58e5ffc3ec6232e",
      "parents": [
        "ceea368e887b1c1c600400f40564eca4f8b40192"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Oct 20 14:36:35 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 03 13:05:14 2011 -0700"
      },
      "message": "Remove extra \u0027/\u0027 in RemoteSpec\n\nurljoin appends a \u0027/\u0027 if only the domain is in the url path.  This\nchange strips that off before creating a RemoteSpec\n"
    },
    {
      "commit": "ceea368e887b1c1c600400f40564eca4f8b40192",
      "tree": "5cdd2d5a985e6b10e9f5116ad5a5aa7065ef7105",
      "parents": [
        "b660539c4ac691312b44c13c6311568749537290"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Oct 20 10:45:47 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 20 11:01:38 2011 -0700"
      },
      "message": "Correctly name projects when mirroring\n\nA bug introduced by relative urls caused projects such as manifest.git\nto be placed in the root directory instead of the directory they should\nby in.\n\nThis fix creates and refers to a resolvedFetchUrl in the _XmlRemote\nclass in order to get a fetchUrl that is never relative.\n"
    },
    {
      "commit": "b660539c4ac691312b44c13c6311568749537290",
      "tree": "fc73316785d794fdb2c9f6c85bb5ff13a2422388",
      "parents": [
        "752371d91b9c7d1e9d6859cdf4cd8fef2f7b245c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 15:58:07 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 15:58:07 2011 -0700"
      },
      "message": "Fix sync on Python 2.6.6\n\nPython 2.6.6 has the same bug as Python 2.7, where HTTP\nauthentication just stops working, but does not have the\nsetter method to clear the retry counter. Work around by\nsetting the field directly if it exists.\n\nChange-Id: I6a742e606bb7750dc66c33fc7c5d1310541db2c8\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "752371d91b9c7d1e9d6859cdf4cd8fef2f7b245c",
      "tree": "f29505f32a824bb4e360176202fd58fd9bce5d8f",
      "parents": [
        "1a68dc58ebc03d58d063235f19282988a2846e63"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 15:23:37 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 15:23:41 2011 -0700"
      },
      "message": "help: Fix help sync\n\nhelp sync crashed as sync required the manifest to be configured to\ncreate the option parser, as the default number of jobs is required.\n\nChange-Id: Ie75e8d75ac0e38313e4aab451cbb24430e84def5\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\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": "df5ee52050a5b8ea4e0bb69c007dac556c18ec03",
      "tree": "760f85dcd1039e3ba6110d39cc041c664730e7cb",
      "parents": [
        "fab96c68e3acfb5403ffe65577563f3cb39e2530"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 14:05:21 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 14:06:11 2011 -0700"
      },
      "message": "Fix Python 2.4 support\n\nChange-Id: I89521ae52fa564f0d849cc51e71fee65b3c47bab\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fab96c68e3acfb5403ffe65577563f3cb39e2530",
      "tree": "972a82f40c3e7de6b88f174f5f5b2a3418f92e40",
      "parents": [
        "bf1fbb20ab33cc479881a2b755e336872971dd78"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 12:00:38 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 12:18:07 2011 -0700"
      },
      "message": "Work around Python 2.7 urllib2 bug\n\nIf the remote is using authenticated HTTP, but does not have\n$GIT_URL/clone.bundle files in each repository, an initial sync\nwould fail around 8 projects in due to the library not resetting\nthe number of failures after getting a 404.\n\nWork around this by updating the retry counter ourselves.\n\nThe urllib2 library is also not thread-safe. Make it somewhat\nsafer by wrapping the critical section with a lock.\n\nChange-Id: I886e2750ef4793cbe2150c3b5396eb9f10974f7f\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "bf1fbb20ab33cc479881a2b755e336872971dd78",
      "tree": "753dc46108148ffa4a579a932e599e6b85450f30",
      "parents": [
        "29472463ba601e9c0513eadb19470e435b2601a1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 09:31:58 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 09:31:58 2011 -0700"
      },
      "message": "Fix AttributeError: \u0027HTTPError\u0027 object has no attribute \u0027reason\u0027\n\nNot every version of urllib2 supplies a reason object on the\nHTTPError exception that it throws from urlopen().  Work around\nthis by using str(e) instead and hope the string formatting includes\nsufficient information.\n\nChange-Id: I0f4586dba0aa7152691b2371627c951f91fdfc8d\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "29472463ba601e9c0513eadb19470e435b2601a1",
      "tree": "5dc815bb61bd53c60fd301f429d779994ef07f9b",
      "parents": [
        "c325dc35f621fe24d0460bb14547cdb51e00c00b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 09:24:07 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 09:24:07 2011 -0700"
      },
      "message": "Work around Python 2.7 failure to initialize base class\n\nurllib2 returns a malformed HTTPError object in certain situations.\nFor example, urllib2 has a couple of places where it creates an\nHTTPError object with no fp:\n\n  if self.retried \u003e 5:\n    # retry sending the username:password 5 times before failing.\n    raise HTTPError(req.get_full_url(), 401, \"basic auth failed\",\n                    headers, None)\n\nWhen it does that, HTTPError\u0027s ctor doesn\u0027t call through to\naddinfourl\u0027s ctor:\n\n  # The addinfourl classes depend on fp being a valid file\n  # object.  In some cases, the HTTPError may not have a valid\n  # file object.  If this happens, the simplest workaround is to\n  # not initialize the base classes.\n  if fp is not None:\n    self.__super_init(fp, hdrs, url, code)\n\nWhich means the \u0027headers\u0027 slot in addinfourl is not initialized and\ninfo() fails.  It is completely insane that urllib2 decides not to\ninitialize its own base class sometimes.\n\nChange-Id: I32a0d738f71bdd7d38d86078b71d9001e26f1ec3\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c325dc35f621fe24d0460bb14547cdb51e00c00b",
      "tree": "9154d75a5a5348609fc3b6d637871298c831b407",
      "parents": [
        "f322b9abb4cadc67b991baf6ba1b9f2fbd5d7812"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Oct 03 08:30:24 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Oct 03 08:30:24 2011 -0700"
      },
      "message": "sync: Fetch after applying bundle and retry after errors\n\nAfter a $GIT_URL/clone.bundle has been applied to the new local\nrepository, perform an incremental fetch using `git fetch` to ensure\nthe local repository is up-to-date. This allows the hosting server\nto offer stale /clone.bundle files to bootstrap a new client.\n\nIf a single git fetch fails, it may succeed again after a short\ndelay.  Transient failures are typical in environments where the\nremote Git server happens to have limits on how many requests it\ncan serve at once (the anonymous git daemon, or an HTTP server).\nWait a randomized delay between 30 and 45 seconds and retry the\nfailed project once.  This delay gives the site time to recover\nfrom a transient traffic spike, and the randomization makes it less\nlikely that a spike occurs again from all of the same clients.\n\nChange-Id: I97fb0fcb33630fb78ac1a21d1a4a3e2268ab60c0\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f322b9abb4cadc67b991baf6ba1b9f2fbd5d7812",
      "tree": "ce75a04fed2e84457800325d158de13645cef67e",
      "parents": [
        "db728cd866d4950779620993e12e76f09eb6e2ee"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 14:50:58 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Sep 28 10:07:36 2011 -0700"
      },
      "message": "sync: Support downloading bundle to initialize repository\n\nAn HTTP (or HTTPS) based remote server may now offer a \u0027clone.bundle\u0027\nfile in each repository\u0027s Git directory. Over an http:// or https://\nremote repo will first ask for \u0027$URL/clone.bundle\u0027, and if present\ndownload this to bootstrap the local client, rather than relying\non the native Git transport to initialize the new repository.\n\nBundles may be hosted elsewhere. The client automatically follows a\nHTTP 302 redirect to acquire the bundle file. This allows servers\nto direct clients to cached copies residing on content delivery\nnetworks, where the bundle may be closer to the end-user.\n\nBundle downloads are resumeable from where they last left off,\nallowing clients to initialize large repositories even when the\nconnection gets interrupted.\n\nIf a bundle does not exist for a repository (a HTTP 404 response\ncode is returned for \u0027$URL/clone.bundle\u0027), the native Git transport\nis used instead. If the client is performing a shallow sync, the\nbundle transport is not used, as there is no way to embed shallow\ndata into the bundle.\n\nChange-Id: I05dad17792fd6fd20635a0f71589566e557cc743\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "db728cd866d4950779620993e12e76f09eb6e2ee",
      "tree": "3a0fb3eb745da641f18dbea75e6bef0c7001f4a4",
      "parents": [
        "c4657969ebd3ec6bf28a37b6a53360314a01be73"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Sep 26 16:34:01 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Sep 28 10:07:01 2011 -0700"
      },
      "message": "Allow remote url to be relative to manifst url\n"
    },
    {
      "commit": "c4657969ebd3ec6bf28a37b6a53360314a01be73",
      "tree": "ada21c1775c4a8d96f30105f4d8c3480ca22fdb4",
      "parents": [
        "7b947de1ee015ab4d981d34566becba8222931ec"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 26 09:08:01 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 26 09:08:44 2011 -0700"
      },
      "message": "sync: Update default -j flag from manifest\n\nIf the manifest is updated and the default sync-j attribute\nwas modified, honor it during this sync session if the user\nhas not supplied a -j flag on the command line.\n\nChange-Id: I127ee5c779e2bbbb40b30bddc10ec1fa704b3bf3\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "7b947de1ee015ab4d981d34566becba8222931ec",
      "tree": "891f01d5cac0a03042558a7893cdebec089ebe5e",
      "parents": [
        "6392c879454bd4fa0e770195ee8424e383d17df2"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Sep 23 11:50:31 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Sep 23 11:50:31 2011 -0700"
      },
      "message": "Ignore missing ~/.netrc\n\nChange-Id: Ifa6065d57a6cb11ad57ddd44bc88d9690fe234ab\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "6392c879454bd4fa0e770195ee8424e383d17df2",
      "tree": "bfbfedb0a1d7f3fbe648deaf09e570ba347feeb0",
      "parents": [
        "97d2b2f7a087bfc695536ae9be962406d82152f2"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 17:44:31 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 18:08:27 2011 -0700"
      },
      "message": "sync: Allow -j to have a default in manifest\n\nThis permits manifest authors to suggest a number of parallel\nfetch operations against a remote server. For example, Gerrit\nCode Review servers support queuing of requests and processes\nthem in first-in, first-out order. Running concurrent fetches\ncan utilize multiple CPUs on the Gerrit server, but will also\ndecrease overall operation latency by having the request put\ninto the queue ready to execute as soon as a CPU is free.\n\nChange-Id: I3d3904acb6f63516bae4b071c510ad57a2afab18\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "97d2b2f7a087bfc695536ae9be962406d82152f2",
      "tree": "7cf3c07c6c9f42f17e1ade91eb354f95a16a0a80",
      "parents": [
        "3a0e782790ab83e3b1e93fe2fd57f7197ace2f76"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 17:23:41 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 18:08:26 2011 -0700"
      },
      "message": "sync: Limit -j to file descriptors\n\nEach worker thread requires at least 3 file descriptors to run the\nforked \u0027git fetch\u0027 child to operate against the local repository.\nMac OS X has the RLIMIT_NOFILE set to 256 by default, which means\na sync -j128 often fails when the workers run out of pipes within\nthe Python parent process.\n\nChange-Id: I2cdb14621b899424b079daf7969bc8c16b85b903\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3a0e782790ab83e3b1e93fe2fd57f7197ace2f76",
      "tree": "efc9b50a3df851750531015480372ad64104eb62",
      "parents": [
        "490d09a31415d3fd1b16f650188bfd8e701ae8e8"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 17:06:41 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 18:08:18 2011 -0700"
      },
      "message": "Add global option --time to track execution\n\nThis prints a simple line after a command ends, providing\ninformation about how long it executed for using real wall\nclock time. Its mostly useful for looking at sync times.\n\nChange-Id: Ie0997df0a0f90150270835d94b58a01a10bc3956\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "490d09a31415d3fd1b16f650188bfd8e701ae8e8",
      "tree": "c7bff91f77533abf15f8b18b3c7e5fe0b3f5146e",
      "parents": [
        "13111b4e97d8cccdba5da974de0996994c64c7e5"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 08:56:47 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 14:52:57 2011 -0700"
      },
      "message": "Support units in progress messages\n\nThis allows our progress meter to be used for bytes transferred, by\nsetting the units to KB or MB to let the user know the size.\n\nChange-Id: Ie8653d4a40d79439026c18bd51915845b2c5bba9\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": "bd0312a4841e9488cf43ae4afb3b58d44eebbbb1",
      "tree": "bb0a60c3068ceb640d9618cb8d7afa716b9609c0",
      "parents": [
        "334851e4b6390f4c78e463b977003f1d967c88ed"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 10:04:23 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 14:52:32 2011 -0700"
      },
      "message": "Support ~/.netrc for HTTP Basic authentication\n\nIf repo tries to access a URL over HTTP and the user needs to\nauthenticate, offer a match from ~/.netrc. This matches behavior\nwith the Git command line client.\n\nChange-Id: I803f3c5d562177ea0330941350cff3cc1e1bef08\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "334851e4b6390f4c78e463b977003f1d967c88ed",
      "tree": "7c8c5004c7cbb3079b460aee97095955013147ff",
      "parents": [
        "014d0609899dba70a1af0b32de377ca08c54aded"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 08:05:31 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 14:51:47 2011 -0700"
      },
      "message": "Enhance HTTP support\n\nSetting REPO_CURL_VERBOSE\u003d1 in the environment will register a debug\nlevel HTTPHandler on the urllib2 library, showing HTTP requests and\nresponses on the stderr channel of repo.\n\nDuring any HTTP or HTTPS request created inside of the repo process,\na custom User-Agent header is now defined:\n\n  User-Agent: git-repo/1.7.5 (Linux) git/1.7.7 Python/2.6.5\n\nChange-Id: Ia5026fb1e1500659bd2af27416d85e205048bf26\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": "44da16e8a0e919c60a6eb7b5503cf915864d7336",
      "tree": "defab719d98c6e511b86c303c297d1da1ebf6ea3",
      "parents": [
        "65e0f35fda0559e79316c8fdbeeaed6dd51e9a4d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 05 14:02:38 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 05 14:16:49 2011 -0700"
      },
      "message": "Change default REPO_URL to code.google.com\n\nChange-Id: If7700daf96fb8f3ee449e5774017272ef31b4b44\n"
    },
    {
      "commit": "65e0f35fda0559e79316c8fdbeeaed6dd51e9a4d",
      "tree": "4944d8cc649b3b9af33f11181d27bee7b709adbb",
      "parents": [
        "08c880db1882743900ce1ed82b5026566b64d1f5"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Mon Apr 18 11:23:29 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jul 20 07:34:23 2011 -0700"
      },
      "message": "Add commit-msg hook also for manifest project\n\nThe manifest project has - by design - not a review URL associated\nwith it. It is actually not even a \u0027project\u0027 in repo\u0027s sense.\n\nThis will prevent the commit-msg hook from being added, which is\nnot necessarily wanted as the project is managed in gerrit.\n\nThis commit will enable the commit-msg hook, which in turn will\nadd the Change-Id-line to every new commit in it. This simplifies\nreplacing patch sets (by git push ... refs/for/...).\n\nChange-Id: I42d0f6fd79e6282d9d47074a3819e68d968999a7\nSigned-off-by: Victor Boivie \u003cvictor.boivie@sonyericsson.com\u003e\n"
    },
    {
      "commit": "08c880db1882743900ce1ed82b5026566b64d1f5",
      "tree": "f4b225c3aea7bb2808d995695e884d7b265bfeea",
      "parents": [
        "a101f1c1670c9992c28980a7028dc6c60028af69"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Tue Apr 19 10:32:52 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jul 20 07:13:48 2011 -0700"
      },
      "message": "Smart tag support\n\nThis is an evolution of \u0027smart-sync\u0027 that adds a new option, -t,\nthat allows you to specify a tag/label to use instead of the\n\"latest good build\" on the current manifest branch which -s does.\n\nSigned-off-by: Victor Boivie \u003cvictor.boivie@sonyericsson.com\u003e\nChange-Id: I8c20fd91104a6aafa0271d4d33f6c4850aade17e\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": "49cd59bc867d5fc29abcdbc4aac9bb7b826b6705",
      "tree": "98d2aa17a934633e7d5398fe9c24fa2f4e2ba61e",
      "parents": [
        "30d452905f166b316152f236422f85c8aa75a2d0"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@chromium.org",
        "time": "Mon Jun 13 21:42:06 2011 -0700"
      },
      "committer": {
        "name": "Doug Anderson",
        "email": "dianders@chromium.org",
        "time": "Tue Jun 14 16:59:19 2011 -0700"
      },
      "message": "Add --depth option to main repo wrapper.\n\nSee related repo change:\n  https://review.source.android.com/#change,22722\n\nChange-Id: I9bdd86971c94604477b91cdf47d6fac2c0bc186e\n"
    },
    {
      "commit": "30d452905f166b316152f236422f85c8aa75a2d0",
      "tree": "cc6a18adb2ea8c0f209f21aca2e64fe20fb06005",
      "parents": [
        "d6c93a28ca8cb079f473f749d805dcff97990225"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@chromium.org",
        "time": "Wed May 04 15:01:04 2011 -0700"
      },
      "committer": {
        "name": "Doug Anderson",
        "email": "dianders@chromium.org",
        "time": "Thu Jun 09 16:48:23 2011 -0700"
      },
      "message": "Add a --depth option to repo init.\n\nChange-Id: Id30fb4a85f4f8a1847420b0b51a86060041eb5bf\n"
    },
    {
      "commit": "d6c93a28ca8cb079f473f749d805dcff97990225",
      "tree": "21cd307899c2a5d1e59df9929d63651ac2ba1da1",
      "parents": [
        "d572a13021b0430eddf83e9caedc9d5add693c62"
      ],
      "author": {
        "name": "Mandeep Singh Baines",
        "email": "msb@google.com",
        "time": "Thu May 26 10:34:11 2011 -0700"
      },
      "committer": {
        "name": "Mandeep Singh Baines",
        "email": "msb@google.com",
        "time": "Thu May 26 10:49:39 2011 -0700"
      },
      "message": "Add branch support to repo upload\n\nThis commit adds a --br\u003d\u003cbranch\u003e option to repo upload.\n\nrepo currently examines every non-published branch. This is problematic\nfor my workflow. I have many branches in my kernel tree. Many of these\nbranches are based off of upstream remotes (I have many remotes) and\nwill never be uploaded (they\u0027ll get sent upstream as a patch).\n\nHaving repo scan these branches adds to my upload processing time\nand clutters the branch selection buffer. I\u0027ve also seen repo get\nconfused when one of my branches is 1000s of commits different from\nm/master.\n\nChange-Id: I68fa18951ea59ba373277b57ffcaf8cddd7e7a40\n"
    },
    {
      "commit": "d572a13021b0430eddf83e9caedc9d5add693c62",
      "tree": "a0dfe1a74aded3d9266eef72ee9ceec4cc9ef5a4",
      "parents": [
        "3ba5f95b46f06ed3d7382346de29ac550d749ec9"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Thu Nov 11 20:36:39 2010 +0100"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 07 17:19:06 2011 -0400"
      },
      "message": "Added repo cherry-pick command\n\nIt is undesired to have the same Change-Id:-line for two separate\ncommits, and when cherry-picking, the user must manually change it.\n\nIf this is not done, bad things may happen (such as when the user\nis uploading the cherry-picked commit to Gerrit, it will instead\nsee it as a new patch-set for the original change, or worse).\n\nrepo cherry-pick works the same was as git cherry-pick, except that\nit replaces the Change-Id with a new one and adds a reference\nback to the commit from where it was picked.\n\nOn failures (when git can not successfully apply the cherry-picked\ncommit), instructions will be written to the user.\n\nChange-Id: I5a38b89839f91848fad43386d43cae2f6cdabf83\n"
    },
    {
      "commit": "3ba5f95b46f06ed3d7382346de29ac550d749ec9",
      "tree": "7b38fcbfc0f0237102b4b94b68684b49cb2d0113",
      "parents": [
        "2630dd9787c1b75b70a980175ffa41b63f59e3b8"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Thu Apr 07 12:51:04 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 07 16:55:35 2011 -0400"
      },
      "message": "Fixed repo checkout error message when git reports errors.\n\nIn the current version of repo checkout, we often get the error:\n  error: no project has branch xyzzy\n\n...even when the actual error was something else.  This fixes it\nto only report the \u0027no project has branch\u0027 when that is actually true.\n\nThis fix is very similar to one made for \u0027repo abandon\u0027:\n  https://review.source.android.com/#change,22207\n\nThe repo checkout error is filed as: \u003chttp://crosbug.com/6514\u003e\n\nTEST\u003dmanual\n\nA sample creating a case where \u0027git checkout\u0027 will fail:\n\n  $ repo start branch1 .\n  $ repo start branch2 .\n  $ touch bogusfile\n  $ git add bogusfile\n  $ git commit -m \"create bogus file\"\n  [branch2 f8b6b08] create bogus file\n   0 files changed, 0 insertions(+), 0 deletions(-)\n   create mode 100644 bogusfile\n  $ echo \"More\" \u003e\u003e bogusfile\n  $ repo checkout branch1 .\n  error: chromite/: cannot checkout branch1\n\nA sample case showing that we still fail if no project has a branch:\n\n  $ repo checkout xyzzy .\n  error: no project has branch xyzzy\n\nChange-Id: I48a8e258fa7a9c1f2800dafc683787204bbfcc63\n"
    },
    {
      "commit": "2630dd9787c1b75b70a980175ffa41b63f59e3b8",
      "tree": "d160084fbdc7fcff49e6f52b7cf0212a52482692",
      "parents": [
        "dafb1d68d33137779c96a83c7e42cac0e7a27ca4"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Thu Apr 07 13:36:30 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 07 16:51:50 2011 -0400"
      },
      "message": "Fixed problems w/ 2nd repo init if first repo init had bad URL.\n\nThis is the simplest fix: if we had problems syncing the\nmanifest.git directory and we were the ones that created it,\nwe should delete it.  This doesn\u0027t try to do anything complex\nlike try to recover from a .repo directory that got broken in\nsome other way.\n\nThis is filed as: \u003chttp://crosbug.com/13403\u003e\n\nTEST\u003dmanual\n\nInit once with a bad URL:\n  $ repo init -u http://foobar.example.com\n  Getting manifest ...\n     from http://foobar.example.com\n  Connection closed by 172.22.121.77\n  error: Couldn\u0027t resolve host \u0027foobar.example.com\u0027 while accessing http://foobar.example.com/info/refs\n\n  fatal: HTTP request failed\n  fatal: cannot obtain manifest http://foobar.example.com\n\nInit again: identical to the first.  Good:\n  $ repo init -u http://foobar.example.com\n  Getting manifest ...\n     from http://foobar.example.com\n  Connection closed by 172.22.121.77\n  error: Couldn\u0027t resolve host \u0027foobar.example.com\u0027 while accessing http://foobar.example.com/info/refs\n\n  fatal: HTTP request failed\n  fatal: cannot obtain manifest http://foobar.example.com\n\nInit with correct URL:\n  $ repo init -u http://git.chromium.org/git/manifest -m minilayout.xml\n  Getting manifest ...\n     from http://git.chromium.org/git/manifest\n  [ ... cut ... ]\n\n  repo initialized in /.../repoiniterr\n\nTry a bad URL after a good one; it doesn\u0027t get saved (good):\n  $ repo init -u http://foobar.example.com\n  Connection closed by 172.22.121.77\n  error: Couldn\u0027t resolve host \u0027foobar.example.com\u0027 while accessing http://foobar.example.com/info/refs\n\n  fatal: HTTP request failed\n  fatal: cannot obtain manifest http://foobar.example.com\n\nJust to confirm, I can still do a good one after a bad...\n  $ repo init -u http://git.chromium.org/git/manifest -m minilayout.xml\n\n  Your Name  [George Washington]:\n  Your Email [george@washington.example.com]:\n\n  Your identity is: George Washington \u003cgeorge@washington.example.com\u003e\n  is this correct [y/n]? y\n\n  repo initialized in /.../repoiniterr\n\nChange-Id: I1692821a330d97b1d218b2e191a93245b33f2362\n"
    },
    {
      "commit": "dafb1d68d33137779c96a83c7e42cac0e7a27ca4",
      "tree": "e0e3c93d316c8cdf48a15fec97c458b391a6039e",
      "parents": [
        "4655e81a75f2ea5f1eaf93de1249886171281e61"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Thu Apr 07 11:46:59 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 07 16:49:23 2011 -0400"
      },
      "message": "Fixed repo abandon to give better messages.\n\nThe main fix is to give an error message if nothing was actually\nabandoned.  See \u003chttp://crosbug.com/6041\u003e.\n\nThe secondary fix is to list projects where the abandon happened.\nThis could be done in a separate CL or dropped altogether if requested.\n\nTEST\u003dmanual\n\n$ repo abandon dougabc; echo $?\nAbandon dougabc: 100% (127/127), done.\nAbandoned in 2 project(s):\n  chromite\n  src/platform/init\n0\n\n$ repo abandon dougabc; echo $?\nAbandon dougabc: 100% (127/127), done.\nerror: no project has branch dougabc\n1\n\n$ repo abandon dougabc; echo $?\nAbandon dougabc: 100% (127/127), done.\nerror: chromite/: cannot abandon dougabc\n1\n\nChange-Id: I79520cc3279291acadc1a24ca34a761e9de04ed4\n"
    },
    {
      "commit": "4655e81a75f2ea5f1eaf93de1249886171281e61",
      "tree": "81ff7048880220c90c9ab0a7c5346a8dfab32a6d",
      "parents": [
        "723c5dc3d62fe07ba4faa17434870917ae87ce9d"
      ],
      "author": {
        "name": "Terence Haddock",
        "email": "thaddock@google.com",
        "time": "Thu Mar 31 12:33:34 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 07 16:36:42 2011 -0400"
      },
      "message": "Add option to check status of projects in parallel.\n\nChange-Id: I6ac653f88573def8bb3d96031d3570ff966251ad\n"
    },
    {
      "commit": "723c5dc3d62fe07ba4faa17434870917ae87ce9d",
      "tree": "3ed0ea8b803d8dab2ae30ae6832d154be85108fb",
      "parents": [
        "e6a0eeb80d46a5e5e99ce17a46f93e83ee2782cc"
      ],
      "author": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Mon Apr 04 11:15:17 2011 -0400"
      },
      "committer": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Mon Apr 04 11:34:47 2011 -0400"
      },
      "message": "Fix parallel sync on python \u003c 2.6.\n\nEvent.isSet was renamed to is_set in 2.6, but we should\nuse the earlier syntax to avoid breaking compatibility\nwith older Python installations.\n\nChange-Id: I41888ed38df278191d7496c1a6eed15e881733f4\n"
    },
    {
      "commit": "e6a0eeb80d46a5e5e99ce17a46f93e83ee2782cc",
      "tree": "b9bb6905b377274f44331cf74c1bf29e50799ceb",
      "parents": [
        "0960b5b53df6df7169c295de5509b0f705352d3b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 22 19:04:47 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 22 19:04:47 2011 -0700"
      },
      "message": "sync: Fix syntax error on Python 2.4\n\nChange-Id: I371d032d5a1ddde137721cbe2b24bfa38f20aaaa\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0960b5b53df6df7169c295de5509b0f705352d3b",
      "tree": "3c0c8b10ec274b1c4621e626a06afdaa2ea390e9",
      "parents": [
        "fc06ced9f9b8b00841991b92a2a661302a69eb7b"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Fri Nov 26 13:42:13 2010 +0100"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 17 09:19:51 2011 -0700"
      },
      "message": "Creating rr-cache\n\nIf git-rerere is enabled, it uses the rr-cache directory that\nrepo currently creates a symlink from, but doesn\u0027t create the\ndestination directory (inside the project\u0027s directory). Git\nwill then complain during merges and rebases.\n\nThis commit creates the rr-cache directory inside the project.\n\nChange-Id: If8b57a04f022fc6ed6a7007d05aa2e876e6611ee\n"
    },
    {
      "commit": "fc06ced9f9b8b00841991b92a2a661302a69eb7b",
      "tree": "2bcb74073cb50022af2d6639a5bcd8c6a86f436f",
      "parents": [
        "fce89f218a57e651e18cb91f5154e226c3f152b5"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Wed Mar 16 15:49:18 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 17 09:17:42 2011 -0700"
      },
      "message": "Make \u0027repo sync -jN\u0027 exit with an error code in the case of sync errors.\n\nThe bug that this is fixing is described here:\n\nhttp://code.google.com/p/chromium-os/issues/detail?id\u003d6813\n\nThis fix allows the helper threads to signal the main thread that they\nsaw an error.  When the main thread sees the error, it will let all\nexisting threads finish, then exit with an error.\n\nChange-Id: If3019bc6b0b3ab9304d49ed2eea53e9d57f3095a\n"
    },
    {
      "commit": "fce89f218a57e651e18cb91f5154e226c3f152b5",
      "tree": "87283ea19114b10352514ebd4e025b1e8f603f8a",
      "parents": [
        "37282b4b9c5b1d9a1ff07f7f0686a81b65a0a5c6"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Mon Mar 14 16:07:42 2011 -0700"
      },
      "committer": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Wed Mar 16 12:55:44 2011 -0700"
      },
      "message": "Add \u0027list\u0027 command to repo.\n\nThis isn\u0027t a required command, but might be more discoverable for\nrepo newbies?\n\nChange-Id: If357346f234774d42e04e024e65acdaf6dca6c62\n"
    },
    {
      "commit": "37282b4b9c5b1d9a1ff07f7f0686a81b65a0a5c6",
      "tree": "aba568b85d38de4cfef90cd771169c9422aef09c",
      "parents": [
        "835cd6888f16ff30a3428adfa3a775efad918880"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Fri Mar 04 11:54:18 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Mar 11 11:53:23 2011 -0800"
      },
      "message": "Support repo-level pre-upload hook and prep for future hooks.\n\nAll repo-level hooks are expected to live in a single project at the\ntop level of that project.  The name of the hooks project is provided\nin the manifest.xml.  The manifest also lists which hooks are enabled\nto make it obvious if a file somehow failed to sync down (or got\ndeleted).\n\nBefore running any hook, we will prompt the user to make sure that it\nis OK.  A user can deny running the hook, allow once, or allow\n\"forever\" (until hooks change).  This tries to keep with the git\nspirit of not automatically running anything on the user\u0027s computer\nthat got synced down.  Note that individual repo commands can add\nalways options to avoid these prompts as they see fit (see below for\nthe \u0027upload\u0027 options).\n\nWhen hooks are run, they are loaded into the current interpreter (the\none running repo) and their main() function is run.  This mechanism is\nused (instead of using subprocess) to make it easier to expand to a\nricher hook interface in the future.  During loading, the\ninterpreter\u0027s sys.path is updated to contain the directory containing\nthe hooks so that hooks can be split into multiple files.\n\nThe upload command has two options that control hook behavior:\n  - no-verify\u003dFalse, verify\u003dFalse (DEFAULT):\n    If stdout is a tty, can prompt about running upload hooks if needed.\n    If user denies running hooks, the upload is cancelled.  If stdout is\n    not a tty and we would need to prompt about upload hooks, upload is\n    cancelled.\n  - no-verify\u003dFalse, verify\u003dTrue:\n    Always run upload hooks with no prompt.\n  - no-verify\u003dTrue, verify\u003dFalse:\n    Never run upload hooks, but upload anyway (AKA bypass hooks).\n  - no-verify\u003dTrue, verify\u003dTrue:\n    Invalid\n\nSample bit of manifest.xml code for enabling hooks (assumes you have a\nproject named \u0027hooks\u0027 where hooks are stored):\n  \u003crepo-hooks in-project\u003d\"hooks\" enabled-list\u003d\"pre-upload\" /\u003e\n\nSample main() function in pre-upload.py in hooks directory:\n  def main(project_list, **kwargs):\n    print (\u0027These projects will be uploaded: %s\u0027 %\n           \u0027, \u0027.join(project_list))\n    print (\u0027I am being a good boy and ignoring anything in kwargs\\n\u0027\n           \u0027that I don\\\u0027t understand.\u0027)\n    print \u0027I fail 50% of the time.  How flaky.\u0027\n    if random.random() \u003c\u003d .5:\n      raise Exception(\u0027Pre-upload hook failed.  Have a nice day.\u0027)\n\nChange-Id: I5cefa2cd5865c72589263cf8e2f152a43c122f70\n"
    },
    {
      "commit": "835cd6888f16ff30a3428adfa3a775efad918880",
      "tree": "8570e971b5e44a0d75341f8eb467ab19e0a09529",
      "parents": [
        "8ced8641c88d37891a46d42ac1805e380ef6c377"
      ],
      "author": {
        "name": "Skyler Kaufman",
        "email": "skyler@google.com",
        "time": "Tue Mar 08 12:14:41 2011 -0800"
      },
      "committer": {
        "name": "Skyler Kaufman",
        "email": "skyler@google.com",
        "time": "Tue Mar 08 13:48:24 2011 -0800"
      },
      "message": "Post-nonexistent-revision crash sidestepped\n\nFix for the bug that leaves a fractional .git directory after attempting to\nperform an initial sync to a nonexistent revision. Moved the initialization of\nthe working directory to after the revision ID has already been checked. Now,\nno project/.git directory gets created at all if the revision ID is bad.\n\nChange-Id: I0c9b2a59573410f1d11de7661591bf02e4ce326b\n"
    },
    {
      "commit": "8ced8641c88d37891a46d42ac1805e380ef6c377",
      "tree": "bb32899a9865ae64a269576598bcc801b69bbcf7",
      "parents": [
        "2536f806258ce2038eea73269290559906cab99a"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Mon Jan 10 14:16:30 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Feb 01 09:57:29 2011 -0800"
      },
      "message": "Renamed \u0027repo_hooks\u0027 function to \u0027_ProjectHooks\u0027.\n\nThis renaming was done for two reasons:\n1. The hooks are actually project-level hooks, not repo-level\n   hooks.  Since we are talking about adding repo-level hooks,\n   It keeps things less confusing if we name the existing hooks\n   to be \"ProjectHooks\"\n2. The function is a private function in project.py and so\n   should have capitalization to match.\n\nI also added a docstring describing this function.\n\nChange-Id: I1d30f5de08e8f9f99f78146e68c76f906782d97e\n"
    },
    {
      "commit": "2536f806258ce2038eea73269290559906cab99a",
      "tree": "272214c4b003a517f5748aaa092ab8f47cd5caa7",
      "parents": [
        "0ce6ca9c7bc285eb644cdaacec92afca24939841"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Mon Jan 10 12:38:37 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Feb 01 09:53:56 2011 -0800"
      },
      "message": "Fixed bug identifying \u0027commit-msg\u0027 files.\n\nThere was a minor typo that would cause repo to (I believe)\nmistakenly identify any file that contained a substring of the\nword \u0027commit-msg\u0027 as a commit message hook.  For example, the file\n\u0027mit\u0027 or the file \u0027msg\u0027 would be treated as a commit message hook.\nI believe that it was intended that repo only recognize files\nnamed exactly \u0027commit-msg\u0027.\n\nChange-Id: I93edbddf3da3cf0935641e6efb19b0a8ee6e2308\n"
    },
    {
      "commit": "0ce6ca9c7bc285eb644cdaacec92afca24939841",
      "tree": "0c3a9d5ddb1beb8fea6ae8edfc99cb81ece4e419",
      "parents": [
        "0fc3a3982922a5c211da7ec85e6ec86b65294566"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 13:26:01 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 13:26:34 2011 -0800"
      },
      "message": "Fix mirror clients with no worktree\n\nCommit \"Make path references OS independent\" (df14a70c45)\nbroke mirror clients by trying to invoke replace() on None\nwhen there is no worktree.\n\nChange-Id: Ie0a187058358f7dcdf83119e45cc65409c980f11\n"
    },
    {
      "commit": "0fc3a3982922a5c211da7ec85e6ec86b65294566",
      "tree": "2dc27c6438093e5f1b25ece7827ee4fa65053c2f",
      "parents": [
        "c7c57e34dbcc58c38c565dc98cfea4bf7736560a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 09:01:24 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 09:01:24 2011 -0800"
      },
      "message": "Bump repo version to 1,10\n\nChange-Id: Ifdc041e7152af31de413b9269f20000acd945b3b\n"
    },
    {
      "commit": "c7c57e34dbcc58c38c565dc98cfea4bf7736560a",
      "tree": "96220b743f1db15eef8140ae8bf6ba2288f6584d",
      "parents": [
        "0d2b61f11d0501fcf1e5a1c19f18dac03e0b09bc"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 03 17:43:16 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:22 2011 -0800"
      },
      "message": "help: Don\u0027t show empty Summary or Description sections\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n(cherry picked from commit 60e679209a5495393ef584efaaad287fc8b77c51)\n"
    },
    {
      "commit": "0d2b61f11d0501fcf1e5a1c19f18dac03e0b09bc",
      "tree": "a0be431dc8225690610c741e8d62b7f09185845d",
      "parents": [
        "2bf9db0d3b0b4cf4e11187ea7438ddeb1262fe21"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 15:22:49 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:22 2011 -0800"
      },
      "message": "sync: Run `git gc --auto` after fetch\n\nUsers may wind up with a lot of loose object content in projects they\ndon\u0027t frequently make changes in, but that are modified by others.\n\nSince we bypass many git code paths that would have otherwise called\nout to `git gc --auto`, its possible for these projects to have\ntheir loose object database grow out of control.  To help prevent\nthat, we now invoke it ourselves during the network half of sync.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n(cherry picked from commit 1875ddd47c0bf38e5cc52e1e5875caabce2d8742)\n"
    },
    {
      "commit": "2bf9db0d3b0b4cf4e11187ea7438ddeb1262fe21",
      "tree": "5f1947cbb7afb8c0c1e4485f705aaf9df6d79a47",
      "parents": [
        "f00e0ce556fc22fef180c74a9d78f1908d9aeb0b"
      ],
      "author": {
        "name": "Mike Lockwood",
        "email": "lockwood@android.com",
        "time": "Tue Jul 14 15:23:39 2009 -0400"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:22 2011 -0800"
      },
      "message": "Add \"repo branch\" as an alias for \"repo branches\"\n\nFor those of us that are used to typing \"git branch\".\n\nSigned-off-by: Mike Lockwood \u003clockwood@android.com\u003e\n(cherry picked from commit 33f0e786bb35ea11da1e3d1746c431da5f1d93eb)\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": "1b5a4a0c5de5fdaa4f8907357a0aa80e365dd199",
      "tree": "64b42dd765bea192245051b41ff21e0b45ff8e7c",
      "parents": [
        "de8b2c4276afec670dee5c7942ac74f2d0c66500"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 18:50:45 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:22 2011 -0800"
      },
      "message": "forall: Silently skip missing projects\n\nIf a project is missing locally, it might be OK to skip over it\nand continue running the same command in other projects.\n\nBug: REPO-43\nChange-Id: I64f97eb315f379ab2c51fc53d24ed340b3d09250\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n(cherry picked from commit d4cd69bdef28c5a9287c85c48a18ce621eba689d)\n"
    },
    {
      "commit": "de8b2c4276afec670dee5c7942ac74f2d0c66500",
      "tree": "4340130ff76580c6ff1a6f41a386bceb21ce91cc",
      "parents": [
        "727ee98a401b5993f6b952074f43c7f770604acf"
      ],
      "author": {
        "name": "Thiago Farina",
        "email": "thiago.farina@gmail.com",
        "time": "Wed Sep 09 00:41:34 2009 -0400"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:22 2011 -0800"
      },
      "message": "Fix to display the usage message of the command download when the user\ndon\u0027t provide any arguments to \u0027repo download\u0027.\n\nSigned-off-by: Thiago Farina \u003cthiago.farina@gmail.com\u003e\n(cherry picked from commit 840ed0fab7cb4c2ab296c7d7d45f13e2523bae1c)\n"
    },
    {
      "commit": "727ee98a401b5993f6b952074f43c7f770604acf",
      "tree": "e13bf1101981e15ef1cdf3a5dcc38a608b70aedd",
      "parents": [
        "df14a70c4529821d7450303ec553a9f608af1656"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Dec 07 08:46:14 2010 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:22 2011 -0800"
      },
      "message": "Use os.environ.copy() instead of dict()\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n(cherry picked from commit 3218c13205694434edb2375ab8a8515554eed366)\n"
    },
    {
      "commit": "df14a70c4529821d7450303ec553a9f608af1656",
      "tree": "4631409d5610fb103912687dc4f8321d9b46f3a4",
      "parents": [
        "f18cb761731a791bf1b9ee8c6308bfce5c9d3e62"
      ],
      "author": {
        "name": "Anthony Newnam",
        "email": "anthony.newnam@garmin.com",
        "time": "Sun Jan 09 17:31:57 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:19 2011 -0800"
      },
      "message": "Make path references OS independent\n\nChange-Id: I5573995adfd52fd54bddc62d1d1ea78fb1328130\n(cherry picked from commit b0f9a02394779c1c9422a9649412c9ac5fb0f12f)\n\nConflicts:\n\n\tcommand.py\n"
    },
    {
      "commit": "f18cb761731a791bf1b9ee8c6308bfce5c9d3e62",
      "tree": "5b1440e04b3945177eb7033f40cf496e7e28ba34",
      "parents": [
        "d3fd537ea59272e2141ccee839400a93c0196e36"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Dec 07 11:41:05 2010 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 16:13:56 2011 -0800"
      },
      "message": "Encode the environment variables passed to git\n\nWindows allows the environment to have unicode values.\nThis will cause Python to fail to execute the command.\n\nChange-Id: I37d922c3d7ced0d5b4883f0220346ac42defc5e9\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d3fd537ea59272e2141ccee839400a93c0196e36",
      "tree": "ce2bcfcaf355fe4f955ca513241890be3393c9c1",
      "parents": [
        "0048b69c038306fe74408a63cdd0773b0d86a8fe"
      ],
      "author": {
        "name": "Trond Norbye",
        "email": "trond.norbye@gmail.com",
        "time": "Mon Jan 03 11:35:15 2011 +0100"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 16:10:04 2011 -0800"
      },
      "message": "Exit with statuscode 0 for repo help init\n\nThe complete help text is printed, so the program executed successfully.\n\nSome tools (like OpenGrok) detects the availibility of a program by\nrunning it with a known set of options and check the return code.\nIt is an easy and portable way of checking for the existence of a program\ninstead of searching the path (and handle extensions) ourselves.\n\nChange-Id: Ic13428c77be4a36d599ccb8c86d893308818eae3\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": "2b8db3ce3e7344b9f3b5216637c5af0d54be5656",
      "tree": "10f0c759efdade6a556eac16b46160b4843135d5",
      "parents": [
        "5df6de075e5fb674368d38f858419425bc8d8d07"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Mon Nov 01 15:08:06 2010 -0700"
      },
      "committer": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Mon Nov 01 15:08:06 2010 -0700"
      },
      "message": "Added feature to print a \u003cnotice\u003e from manifest at the end of a sync.\n\nThis feature is used to convey information on a when a branch has\nceased development or if it is an experimental branch with a few\ngotchas, etc.\n\nYou add it to your manifest XML by doing something like this:\n\u003cmanifest\u003e\n  \u003cnotice\u003e\n    NOTE TO DEVELOPERS:\n      If you checkin code, you have to pinky-swear that it contains no bugs.\n      Anyone who breaks their promise will have tomatoes thrown at them in the\n      team meeting.  Be sure to bring an extra set of clothes.\n  \u003c/notice\u003e\n\n  \u003cremote ... /\u003e\n  ...\n\u003c/manifest\u003e\n\nCarriage returns and indentation are relevant for the text in this tag.\n\nThis feature was requested by Anush Elangovan on the ChromiumOS team.\n"
    },
    {
      "commit": "5df6de075e5fb674368d38f858419425bc8d8d07",
      "tree": "c138ab50fe9e8b08352c1e70e460f83771d56179",
      "parents": [
        "a0de6e8eab97f5dcdb2f51d4e09dd1568623ec58"
      ],
      "author": {
        "name": "Andrei Warkentin",
        "email": "andreiw@motorola.com",
        "time": "Fri Jul 02 17:58:31 2010 -0500"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:20:01 2010 -0700"
      },
      "message": "sync: Use --force-broken to continue other projects\n\nThis adds a new flag -f/--force-broken that will allow the rest of\nthe sync process to continue instead of bailing when a particular\nproject fails to sync.\n\nChange-Id: I23680f2ee7927410f7ed930b1d469424c9aa246e\nSigned-off-by: Andrei Warkentin \u003candreiw@motorola.com\u003e\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a0de6e8eab97f5dcdb2f51d4e09dd1568623ec58",
      "tree": "14a6939f997a33d04396627e1b032b812bfcec2d",
      "parents": [
        "16614f86b3cc8d61ccae7197624fa93fc752767b"
      ],
      "author": {
        "name": "Ficus Kirkpatrick",
        "email": "ficus@android.com",
        "time": "Fri Oct 22 13:06:47 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:12:56 2010 -0700"
      },
      "message": "upload: Remove --replace option\n\nIt hasn\u0027t been necessary for a long time, and its\nfunctionality can be accomplished with \u0027git push\u0027.\n\nChange-Id: Ic00d3adbe4cee7be3955117489c69d6e90106559\n"
    },
    {
      "commit": "16614f86b3cc8d61ccae7197624fa93fc752767b",
      "tree": "218818ddc0e9521a85aa804477e59fff6f28364e",
      "parents": [
        "88443387b1b0508f43b57e104821c6b375806fea"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:05:43 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:08:57 2010 -0700"
      },
      "message": "sync --quiet: be more quiet\n\nChange-Id: I5e8363c7b32e4546d1236cfc5a32e01c3e5ea8e6\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "88443387b1b0508f43b57e104821c6b375806fea",
      "tree": "d3d1e5a3e6caecd8eabbdf7a1491ddcc2788aa3d",
      "parents": [
        "99482ae58a74e236fb40b65c267163a5690f39e1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 08 10:02:09 2010 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 12:08:50 2010 -0700"
      },
      "message": "sync: Enable use of git clone --reference\n\nUse git clone to initialize a new repository, and when possible\nallow callers to use --reference to reuse an existing checkout as\nthe initial object storage area for the new checkout.\n\nChange-Id: Ie27f760247f311ce484c6d3e85a90d94da2febfc\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "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": "ec1df9b7f6310ce5dd9432b727eb9f7bde9f2796",
      "tree": "ea0c10b715d35b6a9b4f92c73b2732b0c53f4966",
      "parents": [
        "06d029c1c8c06a6d446b7cc4d5e763ff0754b149"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Wed Oct 27 17:13:07 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 29 08:15:14 2010 -0700"
      },
      "message": "Don\u0027t allow git fetch to start ControlMaster\n\nTo avoid connectivity problems, we don\u0027t want the ssh process\nthat is started by git fetch to become a ControlMaster for the\noverall sync task.  If it did, we would lose connectivity when\ngit fetch was finished with the current project, causing later\nprojects to not fetch efficiently.\n\nChange-Id: I8d0dcf9b361276ff8c8b5a6324cbd4a501e9c4dd\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": "b715b148076ef589e806a98a183c8f4468f75cf6",
      "tree": "4de4a6d9f095ee933c6f5b8110e4719ac80a8504",
      "parents": [
        "60829ba72fe81b1de1c1e9c6e0de486e9e90bddd"
      ],
      "author": {
        "name": "Patrick Dubroy",
        "email": "dubroy@google.com",
        "time": "Thu Jul 29 17:10:47 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Aug 06 17:05:04 2010 -0700"
      },
      "message": "Fix for handling values of EDITOR which contain a space.\n\nThe shell swallows the 0th arg, which was the filename. Simple fix\nis to pass in an extra arg for the shell to swallow.\n\nChange-Id: Iad6304ba9ccea6e7262ee06ef87d3dac57dbde81\n"
    },
    {
      "commit": "60829ba72fe81b1de1c1e9c6e0de486e9e90bddd",
      "tree": "97c54e944ba5ee7d10897bdfe57e6dbe0e97ae59",
      "parents": [
        "a22f99ae41a9cdda2129c89678a6f581b0445c85"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 16 07:42:45 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 16 07:42:45 2010 -0700"
      },
      "message": "upload: Fix --replace flag\n\n--replace started to fail due to a Python error, I forgot to pass\nthrough the opt structure to the replace function.\n\nChange-Id: Ifcd7a0c715c3fd9070a4c58208612a626382de35\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a22f99ae41a9cdda2129c89678a6f581b0445c85",
      "tree": "73178332fc8b636f3b9c90bd68f361a1456cdd6d",
      "parents": [
        "3575b8f8bdc5f15de23db82499e0ce152f634a19"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 17:40:41 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 17:43:02 2010 -0700"
      },
      "message": "rebase: Pass through more options\n\nPassing through --whitespace\u003dfix to rebase can be useful\nto clean up a branch prior to uploading it for review.\n\nChange-Id: Id85f1912e5e11ff9602e3b342c2fd7441abe67d7\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": "a5ece0e0505324218f38af02a1fe046ca2bcc278",
      "tree": "429cbf0b23d2606737629e7fc77a4ad0b228c90a",
      "parents": [
        "cc50bac8c7706082596d70756249d4964a67f281"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:52:42 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:52:42 2010 -0700"
      },
      "message": "upload -t: Automatically include local branch name\n\nIf the -t flag is given to upload, the local branch name is\nautomatically sent to Gerrit Code Review as the topic branch name\nfor the change(s).  This requires the server to be Gerrit Code\nReview v2.1.3-53-gd50c94e or later, which isn\u0027t widely deployed\nright now, so the default is opt-out.\n\nChange-Id: I034fcacb405b7cb909147152db427fe69dd7bcbf\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "cc50bac8c7706082596d70756249d4964a67f281",
      "tree": "bb87e8d8c128737710db6f00b35327ef28750c5b",
      "parents": [
        "0cb1b3f687da4634e431953ef84fee59dd3f5d59"
      ],
      "author": {
        "name": "Anthony Newnam",
        "email": "anthony.newnam@garmin.com",
        "time": "Thu Apr 08 10:28:59 2010 -0500"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:43:58 2010 -0700"
      },
      "message": "Warn users before uploading if there are local changes\n\nChange-Id: I231d7b6a3211e9f5ec71a542a0109b0c195d5e40\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0cb1b3f687da4634e431953ef84fee59dd3f5d59",
      "tree": "86da739f320891f1b8383eb0579d267e550f9a75",
      "parents": [
        "9e426aa43231073c4a98dae3f6c16d67ab6f3b59"
      ],
      "author": {
        "name": "Julius Gustavsson",
        "email": "juliusb@gmail.com",
        "time": "Thu Jun 17 17:55:02 2010 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:38:08 2010 -0700"
      },
      "message": "sync: Try fetching a tag as a last resort before giving up\n\nIf a tagged commit is not reachable by the fetch refspec configured\nfor the git (usually refs/heads/*) it will not be downloaded by\n\u0027git fetch\u0027.  The tag can however be downloaded with \u0027git fetch\n--tags\u0027 or \u0027git fetch tag \u003ctag\u003e\u0027.\n\nThis patch fixes the situation when a tag is not found after a\n\u0027git fetch\u0027. Repo will issue \u0027git fetch tag \u003ctag\u003e\u0027 before giving\nup completely.\n\nChange-Id: I87796a5e1d51fcf398f346a274b7a069df37599a\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "9e426aa43231073c4a98dae3f6c16d67ab6f3b59",
      "tree": "ca0591e5569e398853ddab2a873098a505f5f96b",
      "parents": [
        "08a3f68d38eec81dfa66f9ea05080c37c863f322"
      ],
      "author": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Thu Apr 01 10:42:33 2010 -0400"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:35:31 2010 -0700"
      },
      "message": "rebase: Automatically rebase branch on upstrea\n\n  Usage: repo rebase [[-i] \u003cproject\u003e...]\n\nRebases the current topic branch of the specified (or all)\nprojects against the appropriate upstream.\n\nNote: Interactive rebase is currently only supported when\nexactly one project is specified on the command line.\n\nChange-Id: I7376e35f27a6585149def82938c1ca99f36db2c4\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "08a3f68d38eec81dfa66f9ea05080c37c863f322",
      "tree": "d70a260e21212a3e7131aaf02555f3df5f030f7a",
      "parents": [
        "feb39d61ef2de893b93153adc8f1f8140a54fc98"
      ],
      "author": {
        "name": "Ben Komalo",
        "email": "benkomalo@google.com",
        "time": "Thu Jul 15 16:03:02 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 15 16:30:32 2010 -0700"
      },
      "message": "upload: Automatically --cc folks in review.URL.autocopy\n\nThe upload command will read review.URL.autocopy from the project\u0027s\nconfiguration and append the list of e-mails specified to the\n--cc argument of the upload command if a non-empty --re argument\nwas provided.\n\nChange-Id: I2424517d17dd3444b20f0e6a003be6e70b8904f6\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "feb39d61ef2de893b93153adc8f1f8140a54fc98",
      "tree": "51c358f6ab4424ad698446ed4bdbc85e9a0d942f",
      "parents": [
        "7198572dd7f5b9d95d83733a98691948a3eb9da3"
      ],
      "author": {
        "name": "Sebastian Schmidt",
        "email": "yath@yath.de",
        "time": "Wed Jun 02 17:18:13 2010 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 17 19:09:37 2010 -0700"
      },
      "message": "Fix format string bugs in grep\n\nThis fixes some format string bugs in grep which cause repo to with\n\"TypeError: not enough arguments for format string\" when grepping and\nthe output contains a valid Python format string.\n\nChange-Id: Ice8968ea106148d409490e4f71a2833b0cc80816\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": "2daf66740bba0b2726462a547910d16cf0822db2",
      "tree": "45139dbc584bdbe297eaea71e6ff71822eaab751",
      "parents": [
        "f4f04d9fa8fda995974c9214eee42c3ea68b1125"
      ],
      "author": {
        "name": "Matthew Buckett",
        "email": "matthew.buckett@oucs.ox.ac.uk",
        "time": "Sat Jul 11 09:43:47 2009 -0400"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 27 18:05:26 2010 -0700"
      },
      "message": "Allow files to be copied into new folders\n\nChange-Id: I7f169e32be5a4328bb87ce7c2ff4b6529e925126\n"
    },
    {
      "commit": "f4f04d9fa8fda995974c9214eee42c3ea68b1125",
      "tree": "2d0acc407a231e272c84e142a37bc231310c77b7",
      "parents": [
        "18afd7f679ab6271a34f4ec01e7755dd85c5dcf4"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 27 16:48:36 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 27 16:48:36 2010 -0700"
      },
      "message": "Do not emit progress if stderr is not a tty\n\nAvoids logging progress data into cron logs, etc.\n\nSuggested-by: Michael Richardson \u003cmcr@sandelman.ottawa.on.ca\u003e\nChange-Id: I4eefa2c282f0ca0a95a0185612b52e2146669e4c\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "18afd7f679ab6271a34f4ec01e7755dd85c5dcf4",
      "tree": "b237d98bb33622718431de5f4a76a60b85f26245",
      "parents": [
        "6623b21e1073a70f7d5cc6eddd364bdab337b439"
      ],
      "author": {
        "name": "Roy Lee",
        "email": "roylee17@gmail.com",
        "time": "Sun May 09 04:32:08 2010 +0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 27 14:54:20 2010 -0700"
      },
      "message": "sync: support --jobs to fetch projects simultaneously\n\nThis patch does two things for being compatibile with\nthose Python which are built without threading support:\n\n1. As the Python document and Shawn suggested, import dummy_threading\n   when the threading is not available.\n\n2. Reserve the single threaded code and make it default.\n   In cases the --jobs does not work properly with dummy_threading,\n   we still have a safe fallback.\n\nChange-Id: I40909ef8e9b5c22f315c0a1da9be38eed8b0a2dc\n"
    },
    {
      "commit": "6623b21e1073a70f7d5cc6eddd364bdab337b439",
      "tree": "263eae9244b36953f1af92f0ced2a1de69ca7b50",
      "parents": [
        "ca8c32cd7ae7c3ae27bb6b649eafbfd54d77f916"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Tue May 11 12:57:01 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon May 17 09:58:55 2010 -0700"
      },
      "message": "Aliasing sync -s to \u0027smartsync\u0027\n\nThis alias will let people use this command without having to\nremember the option.\n\nChange-Id: I3256d9e8e884c5be9e77f70e9cfb73e0f0c544c6\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": "f0a9a1a30e60e92cec9bff4cae030478c276da4d",
      "tree": "cbdb51d2e7d9ae36154f6a05169979d52ec7b3e6",
      "parents": [
        "879a9a5cf0f4ed61df6544949068babbee4f60e2"
      ],
      "author": {
        "name": "Dan Morrill",
        "email": "morrildl@google.com",
        "time": "Wed May 05 08:18:35 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed May 05 09:20:51 2010 -0700"
      },
      "message": "upload: Move confirmation threshold from 3 to 5 commits\n\nChange-Id: I7275d195cf04f02694206b9f838540b0228ff5e1\n"
    },
    {
      "commit": "879a9a5cf0f4ed61df6544949068babbee4f60e2",
      "tree": "81d0a9a675e558f6255c50b6d378c5e4543247b8",
      "parents": [
        "ff6929dde8cae515f7221a60f21fff7c1297aade"
      ],
      "author": {
        "name": "Dan Morrill",
        "email": "morrildl@google.com",
        "time": "Tue May 04 16:56:07 2010 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 04 17:15:37 2010 -0700"
      },
      "message": "upload: Confirm unusually large number of uploaded commit\n\nAdd a sentinel check to require a second explicit confirmation if the\nuser is attempting to upload (or upload --replace) an unusually large\nnumber of commits.  This may help the user to catch an accidentally\nincorrect rebase they had done previously.\n\nChange-Id: I12c4d102f90a631d6ad193486a70ffd520ef6ae0\n"
    },
    {
      "commit": "ff6929dde8cae515f7221a60f21fff7c1297aade",
      "tree": "9c5fad89e1260fe7a266479b4395efffafad2dd8",
      "parents": [
        "1c85f4e43ba2d337b1e8c49bb3c7814a5cb163ae"
      ],
      "author": {
        "name": "Pär Åsfält",
        "email": "par.asfalt@gmail.com",
        "time": "Sat Sep 05 23:10:56 2009 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 04 07:51:28 2010 -0700"
      },
      "message": "branches: Enable output of multiple projects\n\nFixes a bug introduced by 498a0e8a79ab76eeb6adc40f12b04d59820716f9\n(\"Make \u0027repo branches -a\u0027 the default behavior\").\n\nChange-Id: Ib739f82f4647890c46d7c9fb2f2e63a16a0481de\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": "719965af35a2fab96cb578c8a19a48a2cf9fe8e8",
      "tree": "f7616e20abd1159aed1395c0823273c2c0f0e987",
      "parents": [
        "5732e47ebb7a096e3afad49687098c4181c4b300"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Tue Apr 20 15:28:19 2010 -0700"
      },
      "committer": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Mon Apr 26 11:20:22 2010 -0700"
      },
      "message": "Override manifest file only after it is fully written to disk.\n\nWe called \"Override()\" before closing the file passed in argument.\n\nChange-Id: I15adb99deb14297ef72fcb1b0945eb246f172fb0\n"
    },
    {
      "commit": "5732e47ebb7a096e3afad49687098c4181c4b300",
      "tree": "a4a3a2ff650b14471b5bb1337acf594ff872a097",
      "parents": [
        "f3fdf823cf9785e4ceca3e8416b719282d84b6d0"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Mon Apr 26 11:17:29 2010 -0700"
      },
      "committer": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Mon Apr 26 11:19:07 2010 -0700"
      },
      "message": "Strip refs/heads in the branch sent to the manifest server.\n\nThe manifest server doesn\u0027t want to have refs/heads passed to it, so\nwe need to strip that when the branch contains it.\n\nChange-Id: I044f8a9629220e886fd5e02e3c1ac4b4bb6020ba\n"
    },
    {
      "commit": "f3fdf823cf9785e4ceca3e8416b719282d84b6d0",
      "tree": "cfc10b9660e8e01c73166d9368dcca4bd4828c56",
      "parents": [
        "a1bfd2cd7253b1662e08f5ec5be3d863430c756c"
      ],
      "author": {
        "name": "Anthony",
        "email": "anthony@bnovc.com",
        "time": "Sat Sep 26 13:38:52 2009 -0400"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Apr 14 14:21:50 2010 -0700"
      },
      "message": "sync: Safely skip already deleted projects\n\nDo not error if a project is missing on the filesystem, is deleted\nfrom manifest.xml, but still exists in project.list.\n\nChange-Id: I1d13e435473c83091e27e4df571504ef493282dd\n"
    },
    {
      "commit": "a1bfd2cd7253b1662e08f5ec5be3d863430c756c",
      "tree": "48cf4d0a983e37b50220cecc043793d6a5f0c319",
      "parents": [
        "6d7508b3d52781a3f8170a4257c65e2de176cc68"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Tue Apr 06 10:40:01 2010 -0700"
      },
      "committer": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Tue Apr 13 10:20:37 2010 -0700"
      },
      "message": "Add a \u0027smart sync\u0027 option to repo sync\n\nThis option allows the user to specify a manifest server to use when\nsyncing. This manifest server will provide a manifest pegging each\nproject to a known green build. This allows developers to work on a\nknown good tree that is known to build and pass tests, preventing\nfailed builds to hamper productivity.\n\nThe manifest used is not \"sticky\" so as to allow subsequent\n\u0027repo sync\u0027 calls to sync to the tip of the tree.\n\nChange-Id: Id0a24ece20f5a88034ad364b416a1dd2e394226d\n"
    },
    {
      "commit": "6d7508b3d52781a3f8170a4257c65e2de176cc68",
      "tree": "57f5efc9bfcadc053fe9458869aa4a6964f0dcd4",
      "parents": [
        "9452e4ec0941fbee163e35ebdcd6ca6ee7df55cb"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Thu Apr 01 11:03:53 2010 -0700"
      },
      "committer": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Thu Apr 01 11:30:56 2010 -0700"
      },
      "message": "Allow \u0027y\u0027 as a valid response when confirming identity\n\nI prefer having to type only one character rather than all three,\nand it seems like other confirmation prompts use the same style.\n"
    },
    {
      "commit": "9452e4ec0941fbee163e35ebdcd6ca6ee7df55cb",
      "tree": "63730cd5665d1a6233c4e0d922a886cbd035cad3",
      "parents": [
        "4c50deea28badb7007fa6b78c187de50eacdd07a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 18:17:46 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Mar 06 19:21:00 2010 -0800"
      },
      "message": "Automatically install Gerrit Code Review\u0027s commit-msg hook\n\nMost users of repo are also using Gerrit Code Review, and will want\nthe commit-msg hook to be automatically installed into their local\nprojects so that Change-Ids are assigned when commits are created,\nnot when they are first uploaded.\n\n(cherry picked from commit a949fa5d202f0a1f812d7630f3e5bf0f02ca4e98\n but squashed with latest hook script from version 2.1.2)\n\nChange-Id: Ie68b2d60ac85d8c2285d2e1e6a4536eb76695547\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "4c50deea28badb7007fa6b78c187de50eacdd07a",
      "tree": "d51d267854493562a0b8a5a6480050319a78a39b",
      "parents": [
        "d63060fc9546e2132d0ad7791beb795906372e86"
      ],
      "author": {
        "name": "Daniel Sandler",
        "email": "dsandler@menace.cam.corp.google.com",
        "time": "Tue Mar 02 15:38:03 2010 -0500"
      },
      "committer": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Thu Mar 04 11:56:38 2010 -0500"
      },
      "message": "Fail sync when encountering \"N commits behind.\"\n\nThis is almost always something the user needs to address\nbefore continuing work, so promoting it to a failure (rather\nthan simply an informational message) seems the right way to\ngo. As a side-effect, repo will now exit with a non-zero\nstatus code in this situation, so pipelines of the form\n`repo sync \u0026\u0026 make` will fail if there are branches that\nare stalled due to uploaded but unmerged patches.\n"
    }
  ],
  "next": "d63060fc9546e2132d0ad7791beb795906372e86"
}
