)]}'
{
  "log": [
    {
      "commit": "8135cdc53c8737c242a5ba122491c9308a3407d8",
      "tree": "06242ed7759f379e1836598a15cf2fcc91938daf",
      "parents": [
        "4f2517ff1174cd485f0ac93705b0fa9348595f6f"
      ],
      "author": {
        "name": "Jaikumar Ganesh",
        "email": "jaikumar@google.com",
        "time": "Tue Jun 02 15:07:44 2009 -0700"
      },
      "committer": {
        "name": "Jaikumar Ganesh",
        "email": "jaikumar@google.com",
        "time": "Tue Jun 02 15:08:45 2009 -0700"
      },
      "message": "Delete empty parent subdirs after deleting obsolete paths.\n\nAfter sync, we delete obsolete project paths.\nIterate and delete parent subdirs which are empty.\nTested on projects within subdirectories.\n"
    },
    {
      "commit": "4f2517ff1174cd485f0ac93705b0fa9348595f6f",
      "tree": "3d1db8ebf482ca75e8d5d75a589d4b578659f8cb",
      "parents": [
        "fe200eeb520e1b50c00d359ca9e138f6149ce0f2"
      ],
      "author": {
        "name": "Jaikumar Ganesh",
        "email": "jaikumar@google.com",
        "time": "Mon Jun 01 21:10:33 2009 -0700"
      },
      "committer": {
        "name": "Jaikumar Ganesh",
        "email": "jaikumar@google.com",
        "time": "Tue Jun 02 11:00:53 2009 -0700"
      },
      "message": "Update project paths after sync.\n\nAfter a repo sync, some of the project paths might need\nto be removed. This changes maintains a list of project\npaths from the previous sync operation and compares.\n"
    },
    {
      "commit": "fe200eeb520e1b50c00d359ca9e138f6149ce0f2",
      "tree": "9b99437d382d6de77956c1cad57b62aceb41e52a",
      "parents": [
        "078a8b270ff7b8b8c3da5029b1d3ff690fb94cc1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jun 01 15:28:21 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jun 01 15:28:21 2009 -0700"
      },
      "message": "Fix unnecessary self in project.py\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "078a8b270ff7b8b8c3da5029b1d3ff690fb94cc1",
      "tree": "fd882674144c816a0adc9d013d3def5f484c7122",
      "parents": [
        "3c8dea1f8d7c4257d080f9f34159cdb2fffb81e6"
      ],
      "author": {
        "name": "Kis Gergely",
        "email": "gergely.kis@mattakis.com",
        "time": "Mon Jun 01 23:35:56 2009 +0200"
      },
      "committer": {
        "name": "Kis Gergely",
        "email": "gergely.kis@mattakis.com",
        "time": "Tue Jun 02 00:09:07 2009 +0200"
      },
      "message": "Add PyDev project files to repo\n"
    },
    {
      "commit": "3c8dea1f8d7c4257d080f9f34159cdb2fffb81e6",
      "tree": "2a5e48ce93bc913076034f88f8878e4bfffef4dc",
      "parents": [
        "8ad8a0e61d919e76f521f3124c91bd46fbaa84e2"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 18:38:17 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 18:45:20 2009 -0700"
      },
      "message": "Change project.revision to revisionExpr and revisionId\n\nThe revisionExpr field now holds an expression from the manifest,\nsuch as \"refs/heads/master\", while revisionId holds the current\ncommit-ish SHA-1 of the revisionExpr.  Currently that is only\nfilled in if the manifest points directly to a SHA-1.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "8ad8a0e61d919e76f521f3124c91bd46fbaa84e2",
      "tree": "fba74635a3cab4aecd5f9d7dd8672756db3e67e8",
      "parents": [
        "d1f70d9929ddd2748ccc9c1dd2f9603068e1f3e6"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 18:28:25 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 18:45:17 2009 -0700"
      },
      "message": "Change DWIMery hack for dealing with rewound remote branch\n\nThe trick of looking at the reflog for the remote tracking branch\nand only going back one commit works some of the time, but not all of\nthe time.  Its sort of relying on the fact that the user didn\u0027t use\n`repo sync -n` or `git fetch` to only update the tracking branches\nand skip the working directory update.\n\nDoing this right requires looking through the history of the SHA-1\nsource (what the upstream used to be) and finding a spot where the\nDAG diveraged away suddenly, and consider that to be the rewind\npoint.  That\u0027s really difficult to do, as we don\u0027t have a clear\npicture of what that old point was.\n\nA close approximation is to list all of the commits that are in\nHEAD, but not the new upstream, and rebase all of those where the\ncommitter email address is this user\u0027s email address.  In most cases,\nthis will effectively rebase only the user\u0027s new original work.\n\nIf the user is the project maintainer and rewound the branch\nthemselves, and they don\u0027t want all of the commits they have created\nto be rebased onto the new upstream, they should handle the rebase\non their own, after the sync is complete.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d1f70d9929ddd2748ccc9c1dd2f9603068e1f3e6",
      "tree": "746fa0d1ace702f114357d1798bc67eddd1b79a9",
      "parents": [
        "c8a300f6397dad7db00c3654ff6e50e9519ed7c9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 14:58:02 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 09:31:28 2009 -0700"
      },
      "message": "Refactor how projects parse remotes so it can be replaced\n\nWe now feed Project a RemoteSpec, instead of the Remote directly\nfrom the XmlManifest.  This way the RemoteSpec already has the\nfull project URL, rather than just the base, permitting other\ntypes of manifests to produce the URL in their own style.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c8a300f6397dad7db00c3654ff6e50e9519ed7c9",
      "tree": "4bd29d3d580e53965b66ed2d10e13507584fe577",
      "parents": [
        "1b34c9118ed86a15b0bc1094804c095dd7be33cb"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon May 18 13:19:57 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 09:31:28 2009 -0700"
      },
      "message": "Refactor Manifest to be XmlManifest\n\nWe\u0027ll soon be supporting two different manifest formats, but we\ncan\u0027t immediately remove support for the current XML one that is\nin wide spread use within Android.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1b34c9118ed86a15b0bc1094804c095dd7be33cb",
      "tree": "ed27e9a6636f99f1c8e917028c52bb060a52179a",
      "parents": [
        "366ad214b82cadc32920b371f7f99f3f6894ec6f"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 21 18:52:49 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri May 29 09:31:00 2009 -0700"
      },
      "message": "Allow callers of GitConfig to specify the pickle file path\n\nThis way we can put it in another directory than the config file\nitself, e.g. hide it inside \".git\" when parsing a \".gitmodules\"\nfile from the working tree.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "366ad214b82cadc32920b371f7f99f3f6894ec6f",
      "tree": "c77245ffbd172a5f3a6cc6c41dbe14eb4140e9d5",
      "parents": [
        "242b52690d327a77e47140509085f406155c5722"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 12:47:37 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:02:00 2009 -0700"
      },
      "message": "Teach GitConfig how to yield subsection names\n\nThis can be useful when pulling apart a configuration file, like\nfinding all entries which match submodule.*.*.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "242b52690d327a77e47140509085f406155c5722",
      "tree": "92b58b51e6f0b38bea6cc98a0c67604c5d08b7f1",
      "parents": [
        "4cc70ce501321733a1b389e685e964d34b3b4cf5"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:00:29 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:01:52 2009 -0700"
      },
      "message": "Remove support for the extra \u003cremote\u003e definitions in manifests\n\nThese aren\u0027t that widely used, and actually make it difficult for\nusers to fully mirror a forest of repositories, and then permit\nsomeone else to clone off that forest, rather then the original\nupstream servers.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "4cc70ce501321733a1b389e685e964d34b3b4cf5",
      "tree": "d8d30b416faf3cbfe20d07ef3d0f020a16649791",
      "parents": [
        "498a0e8a79ab76eeb6adc40f12b04d59820716f9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 12:49:46 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:01:48 2009 -0700"
      },
      "message": "Remove unused parsing support for \u003crequire commit\u003d\"\"/\u003e\n\nWe haven\u0027t supported this in a while, but the parser was still here.\nIts all dead code, so strip it out.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "498a0e8a79ab76eeb6adc40f12b04d59820716f9",
      "tree": "5b7eb4032e2a979f901a5a5b5cde05b9796ab4cc",
      "parents": [
        "bc7ef67d9bfcebe17c89eb57cb465d0d6d1d999d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon May 18 12:28:54 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon May 18 12:28:57 2009 -0700"
      },
      "message": "Make \u0027repo branches -a\u0027 the default behavior\n\nExtensive discussion with users lead to the fact that needing to\nsupply -a to view what they really wanted to see was just wrong.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "bc7ef67d9bfcebe17c89eb57cb465d0d6d1d999d",
      "tree": "f5cb5e47c6d5ad8bc2ebfdcdef55df77f62349a9",
      "parents": [
        "2f968c943b1c6f61f867fa9b87105836e0e5f354"
      ],
      "author": {
        "name": "Ficus Kirkpatrick",
        "email": "ficus@android.com",
        "time": "Mon May 04 12:45:11 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 05 15:01:18 2009 -0700"
      },
      "message": "Automatically guess Gerrit change number in \"repo upload --replace\"\n\nThis feature only works if you have one commit to replace right now\n(the common case).\n"
    },
    {
      "commit": "2f968c943b1c6f61f867fa9b87105836e0e5f354",
      "tree": "8593b144cfb90a1780ec86591b45039c4c86422f",
      "parents": [
        "2b5b4ac29275ee49184a8aee98f60b744890f5bb"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 30 14:30:28 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 30 14:30:28 2009 -0700"
      },
      "message": "Fix ssh://user@hostname/ style URLs parsing\n\nI only tested this with ssh://hostname/ style URLs, so I failed\nto test ssh://user@hostname/ format, which failed if the hostname\nportion was longer than 1 character.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2b5b4ac29275ee49184a8aee98f60b744890f5bb",
      "tree": "badc77e3f0fc036888766b39386be0e595551472",
      "parents": [
        "6f6cd77a50fd4ffff360d4aee1c6bc05bfb802c1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 23 17:22:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 23 17:22:18 2009 -0700"
      },
      "message": "Disable SSH ControlMaster option on Cygwin\n\nBug: REPO-29\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "6f6cd77a50fd4ffff360d4aee1c6bc05bfb802c1",
      "tree": "981870a18b126f8d5a257eac80f8610a6175aaf0",
      "parents": [
        "896d5dffd313a2ad91fd8bee750241a6512b25dc"
      ],
      "author": {
        "name": "Ficus Kirkpatrick",
        "email": "ficus@android.com",
        "time": "Wed Apr 22 17:27:12 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Apr 22 18:05:50 2009 -0700"
      },
      "message": "Require a project or \u0027--all\u0027 to be specified when using \u0027repo start\u0027.\n"
    },
    {
      "commit": "896d5dffd313a2ad91fd8bee750241a6512b25dc",
      "tree": "c2f11ce9393b2f27cff759578cad6bb5c7bdf486",
      "parents": [
        "9360966bd2ff68fd7257b50df1a7fcb5e62fe189"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 14:51:04 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 14:51:04 2009 -0700"
      },
      "message": "Fix UnboundLocalError: local variable \u0027port\u0027 when using SSH\n\nIf the SSH URL doesn\u0027t contain a port number, but uses the ssh://\nor git+ssh:// syntax we raised a Python runtime error due to the\n\u0027port\u0027 local variable not being assigned a value.  Default it to\nthe IANA assigned port for SSH, 22.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "9360966bd2ff68fd7257b50df1a7fcb5e62fe189",
      "tree": "d9e7183ddde5e647ae2a417b278e7c1e90a5379c",
      "parents": [
        "ef9ce1d0a556211687cec6a782de366407255f41"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 10:50:33 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 10:54:59 2009 -0700"
      },
      "message": "Perform copy file activity when creating a new work directory\n\nPerformance improvements in repo sync caused us to skip out of the\ninitial Sync_LocalHalf without ever running CopyFiles, so we didn\u0027t\ncreate the top level Makefile in new clients whose manifest request\none with a \u003ccopyfile\u003e element.\n\nNow we run CopyFiles after the initial read-tree that populates\nthe project working directory.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ef9ce1d0a556211687cec6a782de366407255f41",
      "tree": "6227c6102e0bd412ffc5ac6c5ef4033d6bc0e293",
      "parents": [
        "05f66b6836ffa4a0a309a4909cb3f8c4a7351727"
      ],
      "author": {
        "name": "Wink Saville",
        "email": "wink@google.com",
        "time": "Tue Apr 21 10:00:16 2009 -0700"
      },
      "committer": {
        "name": "Wink Saville",
        "email": "wink@google.com",
        "time": "Tue Apr 21 10:00:16 2009 -0700"
      },
      "message": "Change -p command to use stdout instead of stderr.\n"
    },
    {
      "commit": "05f66b6836ffa4a0a309a4909cb3f8c4a7351727",
      "tree": "9e12c76532af7eebe67d462d215740b5e2953d8c",
      "parents": [
        "eb7af87bcfc67798b58a99422988b9c368d7d642"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:26:32 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:28:06 2009 -0700"
      },
      "message": "Fix \u0027repo sync\u0027 rebase logic on a published branch\n\nIf the current branch is published, but all published commits are\nmerged into the manifest revision, but there is also at least one\nunpublished commit on the current branch, we should rebase the\nunpublished commit, rather than creating a merge commit.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "eb7af87bcfc67798b58a99422988b9c368d7d642",
      "tree": "4c72901e9c2bf8b44242ca4076fb24fd962ae8b8",
      "parents": [
        "938d608c9c47401fbdb60f3188c718e2f2569bd0"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:02:04 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:28:06 2009 -0700"
      },
      "message": "Document the SSH ControlMaster behavior of repo sync\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "938d608c9c47401fbdb60f3188c718e2f2569bd0",
      "tree": "d4b617e189c187ffbc44d8c4add9047c418118e4",
      "parents": [
        "d63bbf44dc22994ad3cdd73cf852f3d91d87b3f8"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:01:17 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:28:06 2009 -0700"
      },
      "message": "Support a level 2 heading in help description text\n\nThe level 2 headings (denoted by ~) indent the heading two spaces,\nbut continue to use the bold formatter to offset them from the\nother surrounding text.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d63bbf44dc22994ad3cdd73cf852f3d91d87b3f8",
      "tree": "f3fca75ef50280259369c607a7320ba5f02dad02",
      "parents": [
        "a8421a128a2f0a5e6dcca7e37e36ceb63c9291c4"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:05:27 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Apr 21 08:05:27 2009 -0700"
      },
      "message": "Work around \u0027ControlPath too long\u0027 on Mac OS X\n\nMac OS X sets TMPDIR to a very long path within /var, so long\nthat a socket created in that location is too big for a struct\nsockaddr_un on the platform, resulting in OpenSSH being unable\nto create or bind to a socket in that location.\n\nInstead we try to use the very short and very common /tmp, but\nfall back to the guessed default if /tmp does not exist.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a8421a128a2f0a5e6dcca7e37e36ceb63c9291c4",
      "tree": "e1015c05e22d29ab23303bd88ba33c06f8631208",
      "parents": [
        "fb2316146f6e3036e0cc3e08653920964a428a15"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 16:57:46 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 16:57:46 2009 -0700"
      },
      "message": "Fix launching of editor under \u0027repo upload --replace\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fb2316146f6e3036e0cc3e08653920964a428a15",
      "tree": "f19c5c65a035f547ada03496f1576524e4602665",
      "parents": [
        "8bd5e60b16080008771afcaa7de7084487b84780"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 18:53:46 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 16:50:47 2009 -0700"
      },
      "message": "Automatically use SSH control master support during sync\n\nBy creating a background ssh \"control master\" process which lives\nfor the duration of our sync cycle we can easily cut the time for\na no-op sync of 132 projects from 60s to 18s.\n\nBug: REPO-11\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "8bd5e60b16080008771afcaa7de7084487b84780",
      "tree": "1952d4841c15116ae9d26f311a8bc01d09e83e74",
      "parents": [
        "3d2cdd0ea533e885183ba2952b2bfa05eb1d05ab"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:31:36 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:31:36 2009 -0700"
      },
      "message": "Make \u0027repo status\u0027 show the branch you are currently on\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3d2cdd0ea533e885183ba2952b2bfa05eb1d05ab",
      "tree": "a55b6335c7073432914d5c22b2423f4e08b6f630",
      "parents": [
        "4e3d6739a17dcc9efc5adb1d915be0a886db700e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:26:10 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:26:10 2009 -0700"
      },
      "message": "Highlight projects which still have sync failures during \u0027repo status\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "4e3d6739a17dcc9efc5adb1d915be0a886db700e",
      "tree": "6338654fb30ced3fe92b83f1d4e724ee416cf633",
      "parents": [
        "552ac89929db1794200290550dccdd7f3078d13f"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:18:35 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:18:35 2009 -0700"
      },
      "message": "Print \u0027(no branches)\u0027 if the output of `repo branches` is empty\n\nThis way its clear the command did something, and reported\nthat it had nothing to show you, because you have no active\nbranches in this client.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "552ac89929db1794200290550dccdd7f3078d13f",
      "tree": "1da257e391ce65db9ba34fb954ebb9f95a1648ff",
      "parents": [
        "89e717d9481c0c69292a39f85599f5df8277b004"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:15:24 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:15:24 2009 -0700"
      },
      "message": "Modify \u0027repo abandon\u0027 to be more like \u0027repo checkout\u0027 and \u0027repo start\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "89e717d9481c0c69292a39f85599f5df8277b004",
      "tree": "1fc613edd34eb349b673505b872be21a416ab52f",
      "parents": [
        "0f0dfa3930bc16078ef0b1a00ff6849333038fc7"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:04:41 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 15:04:41 2009 -0700"
      },
      "message": "Improve checkout performance for the common unmodified case\n\nMost projects will have their branch heads matching in all branches,\nso switching between them should be just a matter of updating the\nwork tree\u0027s HEAD symref.  This can be done in pure Python, saving\nquite a bit of time over forking \u0027git checkout\u0027.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0f0dfa3930bc16078ef0b1a00ff6849333038fc7",
      "tree": "e802a68c96d4132199aa2a9d721a56403e0d12d2",
      "parents": [
        "76ca9f8145f367f83df19981da4dd934fdda471b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:53:39 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:53:39 2009 -0700"
      },
      "message": "Add progress meter to \u0027repo start\u0027\n\nThis is mostly useful if the number of projects to switch is many\n(e.g. all of Android) and a large number of them are behind the\ncurrent manifest revision.  We wind up needing to run git just to\nmake the working tree match, and that often makes the command take\na couple of seconds longer than we\u0027d like.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "76ca9f8145f367f83df19981da4dd934fdda471b",
      "tree": "d6c095928fd2b1131972206b3c3f498843a736a6",
      "parents": [
        "accc56d82b902e7c7a22401db710958fcb1c7b58"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:48:03 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:48:03 2009 -0700"
      },
      "message": "Make usage of open safer by setting binary mode and closing fds\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "accc56d82b902e7c7a22401db710958fcb1c7b58",
      "tree": "3c3d233fe188315df9d87ddc247672a92167a3f5",
      "parents": [
        "db45da12089bf131579d100ff7990cbc18d07325"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:45:51 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 14:45:51 2009 -0700"
      },
      "message": "Speed up \u0027repo start\u0027 by removing some forks\n\nIts quite common for most projects to be matching the current\nmanifest revision, as most developers only modify one or two projects\nat any one time.  We can speed up `repo start foo` (that impacts\nthe entire client) by performing most of the branch creation and\nswitch operations in pure Python, and thus avoid 4 forks per project.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "db45da12089bf131579d100ff7990cbc18d07325",
      "tree": "c81dbff8a644272dc12cfcdc129ee1f0db3a559f",
      "parents": [
        "50fa1ac6db388c0aa16751b5ad69d296e5eea047"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 13:49:13 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 13:49:13 2009 -0700"
      },
      "message": "Add -p to `repo forall` to improve output formatting\n\nWhen trying to read log output from many projects at once it can\nbe difficult to make sense of which messages came from where.\n\nFor many professional developers it is common to want to view the\nlast week\u0027s worth of your work, so you can write a weekly summary\nof your activity for your status report.\n\nThis is easier with the new -p option:\n\n  repo forall -pc git log --reverse --since\u003d1.week.ago --author\u003dsop\n\nproduces a report of all commits written by me in the last week,\nformatted in a paged output display, with headers inserted in\nfront of each project\u0027s output.\n\nWhere this can be even more useful is with git log\u0027s pickaxe,\ne.g. now we can use:\n\n  repo forall -pc git log -Sbar v1.0..v1.1\n\nto locate all additions or removals of the symbol \u0027bar\u0027 since v1.0,\nup to and including v1.1.  Before displaying the matching commits in\na project, a project header is shown, giving the user some context\ninformation for the matching results.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "50fa1ac6db388c0aa16751b5ad69d296e5eea047",
      "tree": "e72428e0a0f54bbf22f659a4c9b97e16503fb77d",
      "parents": [
        "5da554f294a062c5c469d0a60b6f2ce6a0b3f669"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:44:33 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:44:33 2009 -0700"
      },
      "message": "Clarify the option section header in \u0027repo help grep\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "5da554f294a062c5c469d0a60b6f2ce6a0b3f669",
      "tree": "7bd4469054cf5d19f25b68200845015e483e62f8",
      "parents": [
        "77bb4af241ddfeacfe463272d681f188f92f98b0"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:44:00 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:44:00 2009 -0700"
      },
      "message": "Show options help after the summary for a command\n\nIt is a bit clearer to read this way.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "77bb4af241ddfeacfe463272d681f188f92f98b0",
      "tree": "2bad36b41f003df3ac0277a8fcc3ea5662fa5c88",
      "parents": [
        "fd89b67f5c3ad94f050509e1421c73aff380c0a7"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:33:32 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:33:32 2009 -0700"
      },
      "message": "Improve the help text for \u0027repo init\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fd89b67f5c3ad94f050509e1421c73aff380c0a7",
      "tree": "889c0c8d1aac82009348b687d1b965baab1be371",
      "parents": [
        "a490f03dc23792a86bbe5b2b8c89b32f39774c80"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:28:57 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:28:57 2009 -0700"
      },
      "message": "Clarify options that control the repo executable version\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a490f03dc23792a86bbe5b2b8c89b32f39774c80",
      "tree": "60f1c904b47259643b40f0d7267a2136b3519c7a",
      "parents": [
        "deec0536d657be178e8eed2d597afb9fdc716e99"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:25:58 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:25:58 2009 -0700"
      },
      "message": "Correct note about local_manifest.xml capabilities\n\nWith the \u003cremove-project\u003e element we can remove projects, and\nfully replace them with a different definition.  So this note\nis out of date.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "deec0536d657be178e8eed2d597afb9fdc716e99",
      "tree": "44069dcbed8bf4130a3980086be96dfec96bc7bd",
      "parents": [
        "06e556d202cc6944227667a0664ec7b8eca32076"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:22:13 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:22:13 2009 -0700"
      },
      "message": "Only display project path in \u0027repo stage -i\u0027\n\nGenerally we only show the project path, relative from the top of the\nclient.  Showing the project name may be confusing for the end-user.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "06e556d202cc6944227667a0664ec7b8eca32076",
      "tree": "ed28ad5e1559c54dae8fee3d31cda664ac3b9107",
      "parents": [
        "8225cdc56b9763ef4c000fe72db3e6ae68fc3736"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:19:01 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:19:01 2009 -0700"
      },
      "message": "Improve the help text for \u0027repo start\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "8225cdc56b9763ef4c000fe72db3e6ae68fc3736",
      "tree": "bfda0cb56fdb1e2f44bd50716e57146ad55ee1a7",
      "parents": [
        "337fb9c7e9e9806cef81918c1446c3cf4d4833d4"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:00:35 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:00:35 2009 -0700"
      },
      "message": "Display the URL we will upload changes to for review\n\nThis gives the user the last chance to confirm where the change is\ngoing to be sent to.  Knowing the review server URL will help the\nuser decide if continuing with the upload makes sense.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "337fb9c7e9e9806cef81918c1446c3cf4d4833d4",
      "tree": "f5eca7b61c30bedfaf8eaa13671cdf5e61fd8d28",
      "parents": [
        "9bb961785832356ac7f3f2516d4627cc391a2997"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:59:33 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:59:33 2009 -0700"
      },
      "message": "Improve the help text for \u0027repo upload\u0027\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "9bb961785832356ac7f3f2516d4627cc391a2997",
      "tree": "4510ccafe1ffb506680fe5bf47382c6287523120",
      "parents": [
        "f6906876719a665819c603604603570363389d0d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:53:27 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:53:27 2009 -0700"
      },
      "message": "Remove unused methods from project.ReviewableBranch\n\nThese used to be used back when we had Gerrit 1.x support and used\nHTTP based uploads to transmit changes for review.  Since we moved\nentirely to Gerrit 2.x, these are no longer called.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f6906876719a665819c603604603570363389d0d",
      "tree": "a309fe795eff059f5f464fd522fff74af148415b",
      "parents": [
        "336f7bd0ed70f5ee2595463b6bd8dd277e90c833"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:49:00 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:49:00 2009 -0700"
      },
      "message": "Only fetch repo once-per-day under normal \u0027repo sync\u0027 usage\n\nIts unlikely that a new version of repo will be delivered in any\ngiven day, so we now check only once every 24 hours to see if repo\nhas been updated.  This reduces the sync cost, as we no longer need\nto contact the repo distribution servers every time we do a sync.\n\nrepo selfupdate can still be used to force a check.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "336f7bd0ed70f5ee2595463b6bd8dd277e90c833",
      "tree": "4854b1808bcda18221e097a69c993c4a0cf6137a",
      "parents": [
        "2810cbc7784e9a21e7001c31b65af94fd9ba7a5b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:39:28 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:39:28 2009 -0700"
      },
      "message": "Avoid git fork on the common case of repo not changing\n\nUsually repo is upgraded only once a week, if that often.  Most of\nthe time we invoke HasChanges on the repo project (or even on the\nmanifest project) the current HEAD will resolve to the same SHA-1\nas the remote tracking ref, and there are therefore no changes.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2810cbc7784e9a21e7001c31b65af94fd9ba7a5b",
      "tree": "d127eb13f4749cb40a4f58ce3a83985083751a8a",
      "parents": [
        "6ed4e2834639d0b08686882d2e39cd736d66c688"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:09:16 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 10:09:16 2009 -0700"
      },
      "message": "Only display a progress meter once we spend 0.5 seconds on a task\n\nThe point of the progress meter is to let the user know that the\ntask is progressing, and give them a chance to estimate when it will\nbe complete.  If the task completes in under 0.5 seconds then it\nis sufficiently fast enough that the user doesn\u0027t need to be kept\nup-to-date on its progress; in fact showing the meter may just slow\nthe task down waiting on the tty to redraw.\n\nWe now delay the progress meter 0.5 seconds (or 1 second if the\nPython time.time() function isn\u0027t accurate enough) to avoid any\nreally fast tasks, like a no-op local sync.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "6ed4e2834639d0b08686882d2e39cd736d66c688",
      "tree": "216ff96fd66a7dd0527305e2e96803e704a0d37a",
      "parents": [
        "ad3193a0e587073dee0edef46bdf24f6c6e09779"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 09:59:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 09:59:18 2009 -0700"
      },
      "message": "Disable the progress meter when trace is enabled\n\nThe trace output often interfers with the progress meter, so its\neasier to just disable the progress meter if trace is active.\nIts already verbose enough to let the user know we are working,\nwhich is all the progress meter is there for anyway.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ad3193a0e587073dee0edef46bdf24f6c6e09779",
      "tree": "84ed1894e6f590455ee361beb049c1c271c4e0e7",
      "parents": [
        "b81ac9e65444d0f54d2b6dd24d20b74945c9a36a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 09:54:51 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 09:54:51 2009 -0700"
      },
      "message": "Fix `repo --trace` to show ref and config loads\n\nThe value of the varible TRACE was copied during the import, which\nhappens before the --trace option can be processed.  So instead we\nnow use a function to determine if the value is set, as the function\ncan be safely copied early during import.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b81ac9e65444d0f54d2b6dd24d20b74945c9a36a",
      "tree": "717c5afa16ee88c9b409ce298c95d6f150118775",
      "parents": [
        "0f3dd233ecaf8d145ddb33a5ef1b8d3d71ade476"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 20:44:26 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:45 2009 -0700"
      },
      "message": "Enable tracing of ref scans and config unpickling\n\nThese are not as expensive as spawning a git command, but they are\nnot free either.  We want to keep track of how many times we wind\nup calling them on any particular operation.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0f3dd233ecaf8d145ddb33a5ef1b8d3d71ade476",
      "tree": "327212154350ab031cbd64e39c8ef93cbd9bb6b5",
      "parents": [
        "c12c360f89d4d1cc0a0ad80c4ea0785f84be1848"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 20:32:44 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:45 2009 -0700"
      },
      "message": "Avoid unnecessary git symbolic-ref calls during repo sync\n\nIf the m/BRANCH ref is already pointing at the value set in the\nmanifest there is no reason to set it again.  Leave it alone,\nthus saving a full fork+exec call.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c12c360f89d4d1cc0a0ad80c4ea0785f84be1848",
      "tree": "7e875709a4270e681f7335b7a3171b14b2d8e313",
      "parents": [
        "fbcde472cadfc8319016faca90cb5b57f7a00ee4"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:32 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:45 2009 -0700"
      },
      "message": "Pickle parsed git config files\n\nWe now cache the output of `git config --list` for each of our\nGitConfig instances in a Python pickle file.  These can be read\nback in using only the Python interpreter at a much faster rate\nthan we can fork+exec the git config process.\n\nIf the corresponding git config file has a newer modification\ntimestamp than the pickle file, we delete the pickle file and\nregenerate it.  This ensures that any edits made by the user\nwill be taken into account the next time we consult the file.\n\nThis reduces the time for a no-op repo sync from 0.847s to 0.269s.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fbcde472cadfc8319016faca90cb5b57f7a00ee4",
      "tree": "ee0b2eb641c2874f5d150d0e5b1556778e308b42",
      "parents": [
        "d237b698652120f4d859b6f9e12e3aa15aa7b2d5"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 20:58:02 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:45 2009 -0700"
      },
      "message": "Improve repo sync performance by avoid git forks\n\nBy resolving the current HEAD and the manifest revision using pure\nPython, we can in the common case of \"no changes\" avoid a lot of\ngit operations and directly jump out of the local sync method.\n\nThis reduces the no-op `repo sync -l` time for Android\u0027s 114 projects\nfrom more than 6s to under 0.8s.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d237b698652120f4d859b6f9e12e3aa15aa7b2d5",
      "tree": "007a9736befbfaadfe022fbd99c0ab3d1ced0f3f",
      "parents": [
        "5b23f24881505ae77bf7a43d66663a7f2968b3c1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 18:49:50 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 21:03:41 2009 -0700"
      },
      "message": "Implement git ref reading purely in Python\n\nIts much faster to read the refs from 114 projects when the reader\nis pure Python and just doing file IO than forking 114 git commands\nand parsing their output.\n\nThe reader caches refs based upon file mtimes.  If any single ref\nfile has been modified since the last read, we re-read the entire\nrepository\u0027s ref namespace.  This simplifies the code as we don\u0027t\nneed to worry about shooting down symbolic-refs, but it may cause\nmore IO than is necessary if only one ref gets updated.\n\nThis change drops `repo branches` in Android from 1.658s to 0.206s.\nLikewise, `repo sync` improves dramatically as well.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "5b23f24881505ae77bf7a43d66663a7f2968b3c1",
      "tree": "5e543f57d62b99b677eada896c03e63e5143083b",
      "parents": [
        "66bdd468717a6f52056924837b766cf60889f2ed"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 18:43:33 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 20:59:44 2009 -0700"
      },
      "message": "Implement \u0027git symbolic-ref HEAD\u0027 in Python\n\nThis is invoked once per project in `repo sync`.  Taking it out\nsaves about 1/114 of a second, so on a large set of projects like\nAndroid it can save up to a full second of sync time.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "66bdd468717a6f52056924837b766cf60889f2ed",
      "tree": "c066bcf6b82bf33070933c7235e21956c9ea9f6a",
      "parents": [
        "a608fb024ba0d6b1534e514e3ad2265a9f187182"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 18:47:22 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 20:54:39 2009 -0700"
      },
      "message": "Only compute commits in repo upload if we need to show a prompt\n\nIf the user has disabled a prompt, skip the two commands we use to\nobtain the list of commits and the date of the branch.  These will\nnever be displayed and just waste the end-user\u0027s time.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a608fb024ba0d6b1534e514e3ad2265a9f187182",
      "tree": "c0f7e2f688fd78eeb0a4a70585968c5aa1fd6404",
      "parents": [
        "f8e3273decd883f334939cb24e542d47aba21a43"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 12:11:24 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 12:11:24 2009 -0700"
      },
      "message": "Allow review.URL.autoupload to skip prompting during `repo upload`\n\nIf review.URL.autoupload is set to true in a project\u0027s .git/config\nor in ~/.gitconfig then `repo upload` will automatically upload,\nand skip prompting the end-user.\n\nConversely, if review.URL.autoupload is set to false, then repo\nwill refuse to upload to that project.\n\nBug: REPO-25\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f8e3273decd883f334939cb24e542d47aba21a43",
      "tree": "a66cbf8e107ee6914abb2ad1c4fd6a3c54807fe1",
      "parents": [
        "006734b7981289856f71501f3685fd0ee6d27a6d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 11:00:31 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 11:00:31 2009 -0700"
      },
      "message": "Supporrt mixed case subsection names in Git config files\n\nIn the case of:\n\n  [url \"Foo\"]\n    insteadOf \u003d Bar\n\nWe should return \"Bar\" for the key \"url.Foo.insteadof\", but not\nfor the key \"url.foo.insteadof\".  This requires splitting the\nkey into its components and only lower casing the section and\nvalue name, leaving the subsection portion alone.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "006734b7981289856f71501f3685fd0ee6d27a6d",
      "tree": "426fba3c9549db88cb58363c5c4ba121406e7b6f",
      "parents": [
        "350cde4c4bec5e7b5776cf52d61da600af3efc31"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 10:27:49 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 17 10:28:25 2009 -0700"
      },
      "message": "Remove confusing message from repo sync output\n\nSomeone pointed out this message isn\u0027t always the truth; so we\nshouldn\u0027t print it.  The code path is executed when there are\npublished commits, yet our output talks about unpublished ones.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "350cde4c4bec5e7b5776cf52d61da600af3efc31",
      "tree": "45c09f4113cf5d7c0d5430360344c5d97d93304e",
      "parents": [
        "48244781c2cad1565b4b32b4524ff9931a39f848"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 16 11:21:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 16 11:21:18 2009 -0700"
      },
      "message": "Change repo sync to be more friendly when updating the tree\n\nWe now try to sync all projects that can be done safely first, before\nwe start rebasing user commits over the upstream.  This has the nice\neffect of making the local tree as close to the upstream as possible\nbefore the user has to start resolving merge conflicts, as that extra\ninformation in other projects may aid in the conflict resolution.\n\nInformational output is buffered and delayed until calculation for\nall projects has been done, so that the user gets one concise list\nof notice messages, rather than it interrupting the progress meter.\n\nFast-forward output is now prefixed with the project header, so the\nuser can see which project that update is taking place in, and make\nsome relation of the diffstat back to the project name.\n\nRebase output is now prefixed with the project header, so that if\nthe rebase fails, the user can see which project we were operating\non and can try to address the failure themselves.\n\nSince rebase sits on a detached HEAD, we now look for an in-progress\nrebase during sync, so we can alert the user that the given project\nis in a state we cannot handle.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "48244781c2cad1565b4b32b4524ff9931a39f848",
      "tree": "d408008547b22af4141ba4593064bda618e04ab7",
      "parents": [
        "19a83d80854d88f079f8d6530812b50948f0e28c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 16 08:25:57 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 16 08:25:57 2009 -0700"
      },
      "message": "Refactor error message display in project.py\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "19a83d80854d88f079f8d6530812b50948f0e28c",
      "tree": "2ca943f3833963b4d34d1a675dc9f6ed2f1bd201",
      "parents": [
        "b1168ffadaff387a8b7ab9a9c861073035c505a8"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 16 08:14:26 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 16 08:23:29 2009 -0700"
      },
      "message": "Use default rebase during sync instead of rebase -i\n\nrebase interactive (aka rebase -i) has changed in newer versions\nof git, and doesn\u0027t always generate the sequence of commits the\nsame way it used to.  It also doesn\u0027t handle having a previously\napplied commit try to be applied again.\n\nThe default rebase algorithm is better suited to our needs.\nIt uses --ignore-if-in-upstream when generating the patch series\nfor git-am, and git-am with its 3-way fallback is able to handle\na rename case just as well as the cherry-pick variant used by -m.\nIts also a generally faster implementation.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b1168ffadaff387a8b7ab9a9c861073035c505a8",
      "tree": "8a922e173391861b2426c9700d9caa5765666249",
      "parents": [
        "4c5c7aa74b2dec2cbfb6b6bd7e24d5922e92c112"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 16 08:00:42 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Apr 16 08:05:05 2009 -0700"
      },
      "message": "Don\u0027t divide by zero in progress meter\n\nIf there are no projects to fetch, the progress meter would\nhave divided by zero during `repo sync`, and that throws a\nZeroDivisionError.  Instead we report the progress with an\nunknown amount remaining.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "4c5c7aa74b2dec2cbfb6b6bd7e24d5922e92c112",
      "tree": "68cd00e83ba4e2a8435a47ad95d0e78c5bb500e9",
      "parents": [
        "ff84fea0bb67e249888e826af88286b9ccc5fab3"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 13 14:06:10 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 13 14:06:34 2009 -0700"
      },
      "message": "Document \u0027repo status\u0027 output\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ff84fea0bb67e249888e826af88286b9ccc5fab3",
      "tree": "da273ea2d5a8910f05f12c8367dc996a810397f6",
      "parents": [
        "d33f43a75472cb5104e444c50b880ac3ab2de603"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 13 12:11:59 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 13 12:11:59 2009 -0700"
      },
      "message": "Fix formatting of \u0027repo help sync\u0027\n\nThe formatting for the enviroment variable section was incorrect.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d33f43a75472cb5104e444c50b880ac3ab2de603",
      "tree": "5095c306a520a0af4685ba8454a2d4a206be8ef3",
      "parents": [
        "e756c412e35b9ac1a126985d4d047dbd52f29277"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 13 12:11:31 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 13 12:11:31 2009 -0700"
      },
      "message": "Cleanup checkout help to match other commands\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "e756c412e35b9ac1a126985d4d047dbd52f29277",
      "tree": "e5ed4a87a8b078e44c5369fbdf08b8e1c05d1ef6",
      "parents": [
        "b812a3623646adf38f30dd5cf7e92f1e704669a2"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 13 11:51:15 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 13 11:53:53 2009 -0700"
      },
      "message": "Add \u0027repo selfupdate\u0027 to upgrade only repo\n\nUsers may want to upgrade only repo to the latest release, but\nleave their working tree state alone and avoid \u0027repo sync\u0027.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b812a3623646adf38f30dd5cf7e92f1e704669a2",
      "tree": "d4bad0b64d6a4ac58df42e6d9d0b9730e00fe7d7",
      "parents": [
        "161f445a4dc4518199b132ee4c380788aee2ac63"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 20:37:47 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 20:37:47 2009 -0700"
      },
      "message": "Add \u0027repo grep\u0027 to support searching all projects\n\nUsers can now use \u0027repo grep\u0027 to search all projects, rather than\n\u0027repo forall -c git grep\u0027.  Its not only shorter to type, but it\nalso filters results better by highlighting which projects matched\nin the client workspace.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "161f445a4dc4518199b132ee4c380788aee2ac63",
      "tree": "5fad9f5ba60ed8915614163e8d8e5c72135347ab",
      "parents": [
        "68194f42b0b0e59f206b8e997c26f6a16b74fd4f"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 17:41:44 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 19:01:08 2009 -0700"
      },
      "message": "status: tell the user the working tree is clean\n\nIf there is nothing output at all, tell the user the working tree is\ncompletely clean.  It just gives them a bit more of a warm-fuzzy\nfeeling knowing repo and until the end.  It also more closely\nmatches with the output of git status.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "68194f42b0b0e59f206b8e997c26f6a16b74fd4f",
      "tree": "c9a0a35ed66be9c0321e8ecf896d283bc0af763a",
      "parents": [
        "b1562faee09fe9eb84ea2d1eaf52bf841e2fe811"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:48:52 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 19:01:04 2009 -0700"
      },
      "message": "Add a project progress meter to \u0027repo sync\u0027\n\nThis way users can see how much is left during fetch.  Its\nespecially useful when most syncs are no-ops but there are\nhundreds of repositories to poll.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b1562faee09fe9eb84ea2d1eaf52bf841e2fe811",
      "tree": "f52d37132ea35e1c3d69341e6f2ea547964c3c6e",
      "parents": [
        "3e768c9dc7f77cb2960f990f6e2d15890e96abdb"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 17:04:08 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 17:08:02 2009 -0700"
      },
      "message": "Add \u0027repo sync -l\u0027 to only do local operations\n\nThis permits usage of \u0027repo sync\u0027 while offline, as we bypass the\nnetwork based portions of the code and do only the local sync.\n\nAn example use case might be:\n\n  repo sync -n  ; # while we have network\n  ... some time later ...\n  repo sync -l  ; # while without network, come up to date\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3e768c9dc7f77cb2960f990f6e2d15890e96abdb",
      "tree": "b5d256542c4e6aeeb467cd830584941542c8362f",
      "parents": [
        "96fdcef9e3087d71266d5c78e4a9716e3afa6d41"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:59:36 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 17:08:02 2009 -0700"
      },
      "message": "Add \u0027repo sync -d\u0027 to detach projects from their current topic\n\nThe -d flag moves the project back to a detached HEAD state,\nmatching what is listed in the manifest.  This can be useful to\nset a client to something stable (or at least well-known), such as\nbefore a sequence of \u0027repo download\u0027 commands are used to get some\nchanges for testing.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "96fdcef9e3087d71266d5c78e4a9716e3afa6d41",
      "tree": "2c98825daced9c0ab44f7be11048c438094684eb",
      "parents": [
        "2a1ccb2b0ca6a975614b96271fccd82a58394157"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:29:20 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 17:07:52 2009 -0700"
      },
      "message": "Add \u0027repo sync -n\u0027 to only do the network transfer\n\nThis makes it easier to update all repositories, without actually\nimpacting the working directory, or learning about how to use\n`repo forall -c \u0027git fetch $REPO_REMOTE\u0027 `.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2a1ccb2b0ca6a975614b96271fccd82a58394157",
      "tree": "f5d454e5ea13ead06ed7bf2d2d657126913d1274",
      "parents": [
        "0a389e94de32151189b7064d96eaaa0aa6cdb4a3"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:51:53 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 17:07:32 2009 -0700"
      },
      "message": "Hide the internal sync --repo-upgraded flag from users\n\nThis is only meant to be passed through while repo upgrades itself\nduring a sync.  It should never be something a user invokes on\ntheir own.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0a389e94de32151189b7064d96eaaa0aa6cdb4a3",
      "tree": "526a877b54a070746b7a0ae8b5657baa9e7aed0e",
      "parents": [
        "2675c3f8b5865edff4fe6ec60187b32deef5041d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:21:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:21:18 2009 -0700"
      },
      "message": "Make \u0027repo start\u0027 restartable upon failures\n\nIf `repo start foo` fails due to uncommitted and unmergeable changes\nin a single project, we have switched half of the projects over to\nthe new target branches, but didn\u0027t on the one that failed to move.\n\nThis change improves the situation by doing three things differently:\n\n- We keep going when we encounter an error, so other projects\n  that can successfully switch still switch.\n\n- We ignore projects whose current branch is already on the\n  requested name; they are logically already setup.\n\n- We checkout the branch if it already exists, rather than\n  trying to recreate the branch.\n\nBug: REPO-22\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2675c3f8b5865edff4fe6ec60187b32deef5041d",
      "tree": "cd3f050529425d0fbe89a4dd5eee0d0b15881bc8",
      "parents": [
        "27b07327bc9f4bcda2c29422e064bced092759e3"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:20:25 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:20:25 2009 -0700"
      },
      "message": "Don\u0027t capture stdout during \u0027repo checkout\u0027\n\nThere isn\u0027t any great value in buffering stdout into memory\ncoming from git checkout.  So don\u0027t bother doing it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "27b07327bc9f4bcda2c29422e064bced092759e3",
      "tree": "3eeee2ebd7314a35e9fadb317912791eecb8dbdf",
      "parents": [
        "02d7945eb836f33f63b94fb2a556c844faf0ef8d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:02:48 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 10 16:02:48 2009 -0700"
      },
      "message": "Add a repo branches subcommand to describe current branches\n\nWe now display a summary of the available topic branches in this\nclient, based upon a sorted union of all existing projects.\n\nBug: REPO-21\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "02d7945eb836f33f63b94fb2a556c844faf0ef8d",
      "tree": "5cbcbfd147616337aebec9d72b0fd0de3bf34b64",
      "parents": [
        "8f82a4f828c2765cc4585f9d749f5155f06fd9e9"
      ],
      "author": {
        "name": "Wink Saville",
        "email": "wink@google.com",
        "time": "Fri Apr 10 13:01:24 2009 -0700"
      },
      "committer": {
        "name": "Wink Saville",
        "email": "wink@google.com",
        "time": "Fri Apr 10 13:01:24 2009 -0700"
      },
      "message": "Add checkout command.\n\nTeach repo how to checkout a branch in all projects or a list\nof specific projects.\n\nBug: REPO-21\n"
    },
    {
      "commit": "8f82a4f828c2765cc4585f9d749f5155f06fd9e9",
      "tree": "9eb8208cdb0e6f92db491bc9577544904624ed13",
      "parents": [
        "146fe902b7dd4a7758a8748674aa1e5d3cac2592"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Apr 01 07:24:22 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Apr 01 07:24:22 2009 -0700"
      },
      "message": "Don\u0027t start the pager if stdout is a pipe\n\nThe repo script often uses a pager by default and will produce\ncontrol characters (coloring) to standard output when using the\npager, even if the output is redirected to another pipe or script.\nThis is because the pager setup checked for the terminal presence\non FD 0, and in case of redirection FD 0 is still attached to\nthe terminal.\n\nInstead require that both FD 0 and FD 1 are connected to the terminal\nin order to start the pager.\n\nBug: REPO-19, b.android.com/2004\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "146fe902b7dd4a7758a8748674aa1e5d3cac2592",
      "tree": "fdaff71f1d24ff17e97743365b9dc347a05cf765",
      "parents": [
        "722acefdc45a9d335793a79179c56c67f1dfed24"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 14:06:43 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 14:06:43 2009 -0700"
      },
      "message": "Only lookup review server \u0027/ssh_info\u0027 once per repo process\n\nIf the user has multiple projects to upload changes to, and they\nare all going to the same review server, we only need to query the\n\u0027/ssh_info\u0027 data once.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "722acefdc45a9d335793a79179c56c67f1dfed24",
      "tree": "c9a6f60d06383aff200371a571b6cdcf5f416937",
      "parents": [
        "13cc3844d7426d547a718946ecf365330cc0784c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 13:58:14 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 13:58:14 2009 -0700"
      },
      "message": "Produce a useful error if /ssh_info was HTML and not plain text\n\nIf /ssh_info is protected by an HTML based login page, we may get\nback a \"200 OK\" response from the server with some HTML document\nasking us to authenticate.  This can\u0027t be parsed into a host name\nand port number, so we shouldn\u0027t even try.\n\nValid host names and decimal port numbers cannot contain \u0027\u003c\u0027, but\nan unexpected HTML login page would.  So we test for \u0027\u003c\u0027 to give\nus a fair indicator that the content isn\u0027t what we think it is,\nand bail out.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "13cc3844d7426d547a718946ecf365330cc0784c",
      "tree": "c68fbaacd9bc707f35a1b3fc3b87afa59771daa4",
      "parents": [
        "feabbdb44064888a6f0f1bf8bd0049f7162206c9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 13:54:54 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 25 13:54:54 2009 -0700"
      },
      "message": "Handle review URLs pointing directly at Gerrit\n\nIf a review URL is set to \u0027http://host/Gerrit\u0027 because the user\nthinks that is the correct way to point repo at Gerrit, we should\nbe a bit more flexible and fix the URL by dropping the \u0027/Gerrit\u0027\nsuffix and replace it with \u0027/ssh_info\u0027.\n\nLikewise, if a review URL points already at \u0027/ssh_info\u0027 for a Gerrit\ninstance, we should leave it alone.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "feabbdb44064888a6f0f1bf8bd0049f7162206c9",
      "tree": "1f2ad8484526f1bb382dfba8d94b9a449b8a1616",
      "parents": [
        "8630f39dba4de00345c130e34e98859df169c97a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 19 10:20:27 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 19 10:20:27 2009 -0700"
      },
      "message": "Don\u0027t bother listing branch URLs during upload\n\nModern Gerrit2 automatically outputs the URL for each commit to\nstderr as it creates the records.  Dumping the URL ourselves is\nunnecessary additional output, and worse is just an approximate\nguess for the correct web URL.  Gerrit might not live at the top\nlevel directory for the server, or might even prefer a different\nhostname for web connections than what is listed in the manifest.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "8630f39dba4de00345c130e34e98859df169c97a",
      "tree": "c2631975b9977e02004647f1c740974db82aafe8",
      "parents": [
        "df01883f9b09adcd13f42971a102812f1148408e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 19 10:17:12 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 19 10:17:12 2009 -0700"
      },
      "message": "Fix repo re-init in a mirror to not prompt\n\nOn a mirror client we don\u0027t prompt for user.name,user.email as the\ndata is only necessary if you will make new commits.  On a re-init\nwe were testing the command line option, not the existing IsMirror\nproperty from the manifest configuration file.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "df01883f9b09adcd13f42971a102812f1148408e",
      "tree": "591048750e348501010490b986116132ee564825",
      "parents": [
        "1fc99f4e472c86915cb1affd5507140277711227"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:15:27 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:15:27 2009 -0700"
      },
      "message": "Allow repo init to restart if URL was initially invalid\n\nThis allows the user to run \"repo init -u\" again after an\ninitial attempt failed due to an invalid URL.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1fc99f4e472c86915cb1affd5507140277711227",
      "tree": "f369f77f27b2ef5bc599fad3e801906b7419180d",
      "parents": [
        "1775dbe176fe284a9baa8697f600f03e9b8dabbc"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:06:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:11:51 2009 -0700"
      },
      "message": "Give a more friendly error in \u0027repo init\u0027 if manifest url is invalid\n\nInstead of a stack trace ending in origin/master not existing we\nnow tell the user the manifest url is invalid if \u0027git fetch\u0027 has\nfailed out early.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1775dbe176fe284a9baa8697f600f03e9b8dabbc",
      "tree": "eaeef4183455a6c7d2324d86046368e952dda33e",
      "parents": [
        "521cd3ce67a3621dbbad906f8402dbde8a1e9e63"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:03:04 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 17 08:03:04 2009 -0700"
      },
      "message": "Set forall environment variables to empty string if None\n\nIf the value obtained is None we now set the variable to\n\u0027\u0027 instead, in an attempt to make execve() happier about\nour 3rd argument, the env dictionary.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "521cd3ce67a3621dbbad906f8402dbde8a1e9e63",
      "tree": "4ea6d321126983da8633f4832102986bab2d598b",
      "parents": [
        "5470df6219fd3be675b8700c326713e700847a10"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:53:20 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:53:20 2009 -0700"
      },
      "message": "Support \"repo init -b foo \u0026\u0026 repo sync\" to switch baselines\n\nWe now correctly support re-initializing an existing client to point\nto a different branch of the same manifest repository, effectively\nallowing the client to switch the baseline it is operating on.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "5470df6219fd3be675b8700c326713e700847a10",
      "tree": "3f327a5e7ccf8da49ac54f9b24514b61b37c2b2b",
      "parents": [
        "0ed2bd1d95fb85dac1721f4c71abc8e07ec30e64"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:51:58 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:51:58 2009 -0700"
      },
      "message": "Don\u0027t permit \"repo init --mirror\" in an existing client\n\nSimply setting repo.mirror true doesn\u0027t make a client into a mirror.\nThe on-disk layout is completely wrong for a mirror repository,\nand until we fix our layout for a non-mirror client to more closely\nresemble the upstream we can\u0027t do anything to easily turn on or\nturn off the mirror status flag.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0ed2bd1d95fb85dac1721f4c71abc8e07ec30e64",
      "tree": "d6ac77f59b42c493f92156d697e56d481d8c6cae",
      "parents": [
        "c7a4eefa7e775b64916a66b52ca6c5f31e2cf5c8"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:26:31 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 09 18:26:31 2009 -0700"
      },
      "message": "Add global --trace command line option\n\nThis has the same effect as saying \"export REPO_TRACE\u003d1\" in\nyour shell prior to starting repo, but is documented in the\ncommand usage and perhaps easier to use.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c7a4eefa7e775b64916a66b52ca6c5f31e2cf5c8",
      "tree": "49451ef2767128c809e48f980766c1a02d6504aa",
      "parents": [
        "43c3d9ea17f1436a6b3b2e7e7827da6f48a21da9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 05 10:32:38 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 05 10:32:38 2009 -0800"
      },
      "message": "Add repo manifest -o to save a manifest\n\nThis can be useful to create a new manifest from an existing client,\nespecially if the client wants to use the \"-r\" option to set each\nproject\u0027s revision to the current commit SHA-1, making a sort of a\ntag file that can be used to recreate this exact state elsewhere.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "43c3d9ea17f1436a6b3b2e7e7827da6f48a21da9",
      "tree": "9bfa77f57095fcd04901ee7783c78d49afdb1e9d",
      "parents": [
        "4259b8a2ac0dddb54e98e00afc454bf966d4f058"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:26:50 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:26:50 2009 -0800"
      },
      "message": "Add a \u0027repo manifest\u0027 command whose help is the manifest file format\n\nThis should make it easier for users to discover the file format\non their own, and read about it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "4259b8a2ac0dddb54e98e00afc454bf966d4f058",
      "tree": "dacf06da9c8e72e897703fe32f07e065b26e8b26",
      "parents": [
        "2816d4f387042b5ee38b27f1c9ef0b3f313165ed"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:03:16 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:03:16 2009 -0800"
      },
      "message": "Tell users how to see the complete list of commands\n\nUsing \"repo help --all\" may not be obvious.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2816d4f387042b5ee38b27f1c9ef0b3f313165ed",
      "tree": "12018b67cf103521128597628beee1b7580e8250",
      "parents": [
        "44469464d2e4ddbb217f92e962ff85dfd736772e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:53:18 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:53:18 2009 -0800"
      },
      "message": "Set core.bare to true on mirror repositories\n\nWhen creating a mirror repository we will always be using a bare\nrepository.  Setting $GIT_DIR/config to have core.bare \u003d true is\nreasonable and helps Git to recognize the environment it is in.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "44469464d2e4ddbb217f92e962ff85dfd736772e",
      "tree": "d699677e5583ee7b193f1c868bba43285fcbe61f",
      "parents": [
        "c95583bf4f17b8467f815b6391ffc6c7add08804"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:51:01 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:51:01 2009 -0800"
      },
      "message": "Allow repo forall -c on a mirror by using GIT_DIR as pwd\n\nWe can permit a forall on a mirror, but only if we put\nthe command into the git repository.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c95583bf4f17b8467f815b6391ffc6c7add08804",
      "tree": "c69bf8a061279b79326fb00f2197efcd8726864c",
      "parents": [
        "6a5644d392069b67f17c8ce6cb10f07cce71cc1c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:47:06 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:47:06 2009 -0800"
      },
      "message": "Don\u0027t permit users to run repo status in a mirror client\n\nIf a client was created with \"repo init --mirror\" then there are\nno working directories present, and no files checked out.  Using\na command like \"repo status\" in this context makes no sense, and\nactually throws back a Pytyon traceback at the console when the\nunderlying commands fail out.\n\nWe now tag commands with the MirrorSafeCommand type if they are\nable to be executed within a mirror directory safely.  Using a\ncommand in a mirror which lacks this base class results in a\nuseful error letting you know the command isn\u0027t supported.\n\nBug: REPO-14\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "6a5644d392069b67f17c8ce6cb10f07cce71cc1c",
      "tree": "e53999c93913da0558d4c247e5bb726a6c02ce2f",
      "parents": [
        "fe0867595635b0dc007088053c5901331ac92536"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 13:52:20 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 13:52:20 2009 -0800"
      },
      "message": "Get rid of the horrible android import work around hack\n\nMonths ago when the Android Open Source Project launched we had some\nimport errors that had to be fixed and worked over.  These hacks\nwere here to help users update their clients to newer versions of\nthe imported code.\n\nIts very likely all clients have either been deleted, or have been\nupdated and have the fixed imports.  So we don\u0027t need this hack in\nrepo anymore.\n\nIf a very ancient client still existed, it would need to be created\nfrom scratch anyway, due to the Android cupcake branch merging\ninto master and the manifest changes not being able to be handled\ncorrectly by repo.  A new client wouldn\u0027t have the incorrectly\nimported code in it, and thus wouldn\u0027t need this hack.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fe0867595635b0dc007088053c5901331ac92536",
      "tree": "3930f4c4b92da8ab4d82c59791692b189a446d27",
      "parents": [
        "be0e8ac232de862d287927c4d735cf30f040cf42"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 13:49:48 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 13:49:48 2009 -0800"
      },
      "message": "Fix repo status when there are renamed/copied files\n\nI missed a parameter in the format string, but still provided the\nvalue in the parameter list, so the format failed to produce an\noutput message.\n\nBug: REPO-15\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "be0e8ac232de862d287927c4d735cf30f040cf42",
      "tree": "bd967fd652ed0da2cd967a66fe5f239780d61120",
      "parents": [
        "47c1a63a07ebd67efac00ca9e0d877633aea5881"
      ],
      "author": {
        "name": "Jeff Bailey",
        "email": "jeffbailey@google.com",
        "time": "Wed Jan 21 19:05:15 2009 -0500"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 19:32:28 2009 -0800"
      },
      "message": "Export additional environment variables to repo forall:\n\nREPO_PATH is the path relative the the root of the client.\n\nREPO_REMOTE is the name of the remote system from the manifest.\n\nREPO_LREV is the name of the revision from the manifest, but\ntranslated to something the local repository knows.\n\nREPO_RREV is the name of the revision from the manifest.\n\nThis allows us to do commands like:\n\n  repo forall -c \u0027echo \"(cd $REPO_PATH \u0026\u0026 git checkout `git rev-parse HEAD`)\"\u0027\n"
    }
  ],
  "next": "47c1a63a07ebd67efac00ca9e0d877633aea5881"
}
