)]}'
{
  "log": [
    {
      "commit": "e7a3bcbbb8083e812ce07a5459f0e6d30edfb9fe",
      "tree": "24c2d93c0082463111cac4359680db7ad35a75da",
      "parents": [
        "25b51d8cb755e62dfcba94b90c755e5c167ccf7c",
        "0ce6ca9c7bc285eb644cdaacec92afca24939841"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 13:28:22 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 13:28:22 2011 -0800"
      },
      "message": "Merge branch \u0027stable\u0027\n\n* stable:\n  Fix mirror clients with no worktree\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": "25b51d8cb755e62dfcba94b90c755e5c167ccf7c",
      "tree": "2ce2978cda8e269a6e0c661fa9e446ca8f4f957d",
      "parents": [
        "cef005c3e8d185aa1c6176bd0d38d7867d352fa9",
        "0fc3a3982922a5c211da7ec85e6ec86b65294566"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 09:02:23 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 10 09:02:23 2011 -0800"
      },
      "message": "Merge branch \u0027stable\u0027\n\n* stable:\n  Bump repo version to 1,10\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": "cef005c3e8d185aa1c6176bd0d38d7867d352fa9",
      "tree": "0699635c5d912ea523747be299766f5cab9180b3",
      "parents": [
        "71cab95b4cc6758d5f18f19412188d46d0a29190",
        "c7c57e34dbcc58c38c565dc98cfea4bf7736560a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:30 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:39:30 2011 -0800"
      },
      "message": "Merge branch \u0027maint\u0027\n\n* maint:\n  help: Don\u0027t show empty Summary or Description sections\n  sync: Run `git gc --auto` after fetch\n  Add \"repo branch\" as an alias for \"repo branches\"\n  upload: Catch and cleanly report connectivity errors\n  forall: Silently skip missing projects\n  Fix to display the usage message of the command download when the user don\u0027t provide any arguments to \u0027repo download\u0027.\n  Use os.environ.copy() instead of dict()\n  Make path references OS independent\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": "71cab95b4cc6758d5f18f19412188d46d0a29190",
      "tree": "0699635c5d912ea523747be299766f5cab9180b3",
      "parents": [
        "9275fd43294e760e47736857113f32a2f189c6c6",
        "f18cb761731a791bf1b9ee8c6308bfce5c9d3e62"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:29:50 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sun Jan 09 17:29:50 2011 -0800"
      },
      "message": "Merge branch \u0027stable\u0027\n\n* stable:\n  Encode the environment variables passed to git\n  Exit with statuscode 0 for repo help init\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": "9275fd43294e760e47736857113f32a2f189c6c6",
      "tree": "6e4f48d0a3691896f5bdff655077e4db268a32bf",
      "parents": [
        "13f3da50d40b89ee5b05f5f3de9542c20edac6d1",
        "0048b69c038306fe74408a63cdd0773b0d86a8fe"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Dec 22 14:46:15 2010 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Dec 22 14:46:15 2010 -0800"
      },
      "message": "Merge branch \u0027stable\u0027\n\n* stable:\n  Fixed race condition in \u0027repo sync -jN\u0027 that would open multiple masters.\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": "13f3da50d40b89ee5b05f5f3de9542c20edac6d1",
      "tree": "d085b6f6b498bde85a1969fce884dd24e88d03d5",
      "parents": [
        "3218c13205694434edb2375ab8a8515554eed366",
        "2b8db3ce3e7344b9f3b5216637c5af0d54be5656"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Dec 07 10:31:19 2010 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Dec 07 11:13:29 2010 -0800"
      },
      "message": "Merge branch \u0027stable\u0027\n\n* stable: (33 commits)\n  Added feature to print a \u003cnotice\u003e from manifest at the end of a sync.\n  sync: Use --force-broken to continue other projects\n  upload: Remove --replace option\n  sync --quiet: be more quiet\n  sync: Enable use of git clone --reference\n  Only delete corrupt pickle config files if they exist\n  Don\u0027t allow git fetch to start ControlMaster\n  Check for existing SSH ControlMaster\n  Fix for handling values of EDITOR which contain a space.\n  upload: Fix --replace flag\n  rebase: Pass through more options\n  upload: Allow review.HOST.username to override email\n  upload -t: Automatically include local branch name\n  Warn users before uploading if there are local changes\n  sync: Try fetching a tag as a last resort before giving up\n  rebase: Automatically rebase branch on upstrea\n  upload: Automatically --cc folks in review.URL.autocopy\n  Fix format string bugs in grep\n  Do not invoke ssh with -p argument when no port has been specified.\n  Allow files to be copied into new folders\n  ...\n\nConflicts:\n\tgit_config.py\n\tmanifest_xml.py\n\tsubcmds/init.py\n\tsubcmds/sync.py\n\tsubcmds/upload.py\n\nChange-Id: I4756a6908277e91505c35287a122a775b68f4df5\n"
    },
    {
      "commit": "3218c13205694434edb2375ab8a8515554eed366",
      "tree": "fe791872aab6dcdd74bee68fb377c77bd41b1173",
      "parents": [
        "b0f9a02394779c1c9422a9649412c9ac5fb0f12f"
      ],
      "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": "Tue Dec 07 08:46:14 2010 -0800"
      },
      "message": "Use os.environ.copy() instead of dict()\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b0f9a02394779c1c9422a9649412c9ac5fb0f12f",
      "tree": "f7cb755beb0dd1a24406a714d9433ecebf6ed208",
      "parents": [
        "69b1e8aa65ab933fa919166d88aec90c86852beb"
      ],
      "author": {
        "name": "Anthony Newnam",
        "email": "anthony.newnam@garmin.com",
        "time": "Mon Nov 29 13:15:24 2010 -0600"
      },
      "committer": {
        "name": "Anthony Newnam",
        "email": "anthony.newnam@garmin.com",
        "time": "Mon Nov 29 13:17:53 2010 -0600"
      },
      "message": "Make path references OS independent\n\nChange-Id: I5573995adfd52fd54bddc62d1d1ea78fb1328130\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": "69b1e8aa65ab933fa919166d88aec90c86852beb",
      "tree": "0a8635a835abfd8c05a04bd03639ab2d07e70d5f",
      "parents": [
        "840ed0fab7cb4c2ab296c7d7d45f13e2523bae1c",
        "9452e4ec0941fbee163e35ebdcd6ca6ee7df55cb"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Mar 06 19:29:56 2010 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Mar 06 19:29:56 2010 -0800"
      },
      "message": "Merge branch \u0027stable\u0027\n\n* stable:\n  Automatically install Gerrit Code Review\u0027s commit-msg hook\n  Fail sync when encountering \"N commits behind.\"\n  Check that we are not overwriting a local repository when syncing.\n  Honor url.insteadOf when setting up SSH control master connection\n  sync: Fix split call on malformed email addresses\n  Fixing project renaming bug.\n\nConflicts:\n\thooks/commit-msg\n\tproject.py\n\tsubcmds/sync.py\n\nChange-Id: I5eaf8fef8cbe4a95d124368112293a9ca64325bf\n"
    },
    {
      "commit": "9452e4ec0941fbee163e35ebdcd6ca6ee7df55cb",
      "tree": "63730cd5665d1a6233c4e0d922a886cbd035cad3",
      "parents": [
        "4c50deea28badb7007fa6b78c187de50eacdd07a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 18:17:46 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Mar 06 19:21:00 2010 -0800"
      },
      "message": "Automatically install Gerrit Code Review\u0027s commit-msg hook\n\nMost users of repo are also using Gerrit Code Review, and will want\nthe commit-msg hook to be automatically installed into their local\nprojects so that Change-Ids are assigned when commits are created,\nnot when they are first uploaded.\n\n(cherry picked from commit a949fa5d202f0a1f812d7630f3e5bf0f02ca4e98\n but squashed with latest hook script from version 2.1.2)\n\nChange-Id: Ie68b2d60ac85d8c2285d2e1e6a4536eb76695547\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "4c50deea28badb7007fa6b78c187de50eacdd07a",
      "tree": "d51d267854493562a0b8a5a6480050319a78a39b",
      "parents": [
        "d63060fc9546e2132d0ad7791beb795906372e86"
      ],
      "author": {
        "name": "Daniel Sandler",
        "email": "dsandler@menace.cam.corp.google.com",
        "time": "Tue Mar 02 15:38:03 2010 -0500"
      },
      "committer": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Thu Mar 04 11:56:38 2010 -0500"
      },
      "message": "Fail sync when encountering \"N commits behind.\"\n\nThis is almost always something the user needs to address\nbefore continuing work, so promoting it to a failure (rather\nthan simply an informational message) seems the right way to\ngo. As a side-effect, repo will now exit with a non-zero\nstatus code in this situation, so pipelines of the form\n`repo sync \u0026\u0026 make` will fail if there are branches that\nare stalled due to uploaded but unmerged patches.\n"
    },
    {
      "commit": "d63060fc9546e2132d0ad7791beb795906372e86",
      "tree": "9b0241a1b609cc1563582e6664e3df27732de3af",
      "parents": [
        "b6ea3bfcc398417b91a4fa5a486324f4d904b022"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Wed Jan 20 10:27:50 2010 -0800"
      },
      "committer": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Wed Jan 20 10:27:50 2010 -0800"
      },
      "message": "Check that we are not overwriting a local repository when syncing.\n\nIf a local git repository exists within the same folder as a new project that\nis added, when the user syncs the repo, the sync will overwrite the local\nfiles under the project\u0027s .git repository with its own symlinks. Make sure\nthat we do not overwrite \u0027normal\u0027 files in repo and throw an error when\nthat happens.\n"
    },
    {
      "commit": "b6ea3bfcc398417b91a4fa5a486324f4d904b022",
      "tree": "dc6bc95c3b05ab032a343bbeeee5ac62e917b5da",
      "parents": [
        "aa4982e4c937d9be0f69c250692839eb98a184e8"
      ],
      "author": {
        "name": "Ulrik Sjolin",
        "email": "ulrik.sjolin@gmail.com",
        "time": "Sun Jan 03 18:20:17 2010 +0100"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Jan 04 05:38:39 2010 -0800"
      },
      "message": "Honor url.insteadOf when setting up SSH control master connection\n\nRepo can now properly handle url.insteadOf sections in the\nuser\u0027s ~/.gitconfig file.  This means that a user can now enjoy\nthe master-ssh functionality even if he/she uses insteadOf\u0027s in\n~/.gitconfig to rewrite git:// URLs to ssh:// style URLs.\n\nChange-Id: Ic0f04a9c57206a7b89eb0f10bf188c4c483debe3\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "aa4982e4c937d9be0f69c250692839eb98a184e8",
      "tree": "5a86ac62a56f93e8ad3a784686a53e333ebadac3",
      "parents": [
        "9bb1816bdc2c21811ea6a87ba6eb745bdf3c041c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Dec 30 18:38:27 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Dec 30 18:38:27 2009 -0800"
      },
      "message": "sync: Fix split call on malformed email addresses\n\nIf an email address in a commit object contains a space, like a few\nmalformed ones on the Linux kernel, we still want to split only on\nthe first space.\n\nUnfortunately my brain was too damaged by Perl and originally wrote\nthe split asking for 2 results; in Python split\u0027s argument is how\nmany splits to perform.  Here we want only 1 split, to break apart\nthe commit identity from the email address on the same line.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "9bb1816bdc2c21811ea6a87ba6eb745bdf3c041c",
      "tree": "bedfcfbf5bd21c3defccead65a441cbb0e8e8be1",
      "parents": [
        "c24c720b6135a8f7975bf9af265124eee2d464cb"
      ],
      "author": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Mon Dec 07 15:38:01 2009 -0800"
      },
      "committer": {
        "name": "Nico Sallembien",
        "email": "nsallembien@google.com",
        "time": "Thu Dec 10 15:24:45 2009 -0800"
      },
      "message": "Fixing project renaming bug.\n\nThis bug happens when a project gets added to the manifest, and\nthen is renamed. Users who happened to have run \"repo sync\" after\nthe project was added but before the rename happened will try to\nread the data from the old project, as the manifest was only updated\nafter all projects were updated successfully.\n"
    },
    {
      "commit": "840ed0fab7cb4c2ab296c7d7d45f13e2523bae1c",
      "tree": "4b9d661e64b3441ef11fc24ff1b4629697ac188f",
      "parents": [
        "c024912fb8227db2a1c9232add3b1e7256af170a"
      ],
      "author": {
        "name": "Thiago Farina",
        "email": "thiago.farina@gmail.com",
        "time": "Wed Sep 09 00:41:34 2009 -0400"
      },
      "committer": {
        "name": "Thiago Farina",
        "email": "thiago.farina@gmail.com",
        "time": "Wed Sep 09 00:41:34 2009 -0400"
      },
      "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"
    },
    {
      "commit": "c024912fb8227db2a1c9232add3b1e7256af170a",
      "tree": "2289607dddee108d7796feb25ad2f7e00be224df",
      "parents": [
        "15f6579eb3a2f3cb0e432ed39ac39d8678786161"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Aug 25 11:38:11 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Aug 25 12:03:55 2009 -0700"
      },
      "message": "commit-msg: Don\u0027t create message with only Change-Id\n\nIf a user aborts a commit, the commit-msg hook is still called,\nbut with an empty file.  We need to leave the empty file alone.\n\nChange-Id: I13766135dac267823cb08ab76f67d2000ba2d1ce\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "15f6579eb3a2f3cb0e432ed39ac39d8678786161",
      "tree": "156a3d9d0e47df02293ac60c6d93bb8017634a25",
      "parents": [
        "d4cd69bdef28c5a9287c85c48a18ce621eba689d"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 19:23:55 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 19:23:55 2009 -0700"
      },
      "message": "commit-msg: Update the commit message hook\n\nThis version fixes a bug where Change-Id lines become the subject\nline, if the subject used a pattern like the subject of this\nmessage does.\n\nChange-Id: I7f7e0363091d03eb05dead2992fc19763214de65\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "d4cd69bdef28c5a9287c85c48a18ce621eba689d",
      "tree": "775577d2a74a7ed131dec7c259441b45833eee04",
      "parents": [
        "d2dfac81ad6a060179b4b2289060af2dc7a5cdfd"
      ],
      "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": "Sat Aug 22 18:51:02 2009 -0700"
      },
      "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"
    },
    {
      "commit": "d2dfac81ad6a060179b4b2289060af2dc7a5cdfd",
      "tree": "c783e72b72e7c199ef39d036bb94ca15ec7c59ec",
      "parents": [
        "47199010671a6724e18f061f4da63dcd46e3f354"
      ],
      "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": "Sat Aug 22 18:41:16 2009 -0700"
      },
      "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"
    },
    {
      "commit": "47199010671a6724e18f061f4da63dcd46e3f354",
      "tree": "42fd5aafb13bb3b949f373067c3de05c5fd24b27",
      "parents": [
        "a949fa5d202f0a1f812d7630f3e5bf0f02ca4e98"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 18:24:13 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Aug 22 18:41:09 2009 -0700"
      },
      "message": "upload: Document --replace is deprecated\n\nChange-Id: I52715bcfec9c038d0e02505aa7e4054ebc0434aa\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a949fa5d202f0a1f812d7630f3e5bf0f02ca4e98",
      "tree": "fb0a8ad39a99827747dce6272bcd10dd33c41756",
      "parents": [
        "0afac0856cee05929ec8aa952f6023985e5ad1e4"
      ],
      "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 Aug 22 18:22:04 2009 -0700"
      },
      "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\nChange-Id: Ide42e93b068832f099d68a79c2863d22145d05ad\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0afac0856cee05929ec8aa952f6023985e5ad1e4",
      "tree": "d6ad5b82055d614588dc12812f1039e72c8f1e55",
      "parents": [
        "33f0e786bb35ea11da1e3d1746c431da5f1d93eb",
        "4c0f67046543c7c6ab24175e143001f14b76ea01"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Aug 17 08:09:02 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Aug 17 08:09:05 2009 -0700"
      },
      "message": "Merge change 11206\n\n* change 11206:\n  Do not invoke ssh with -p argument when no port has been specified.\n"
    },
    {
      "commit": "4c0f67046543c7c6ab24175e143001f14b76ea01",
      "tree": "4716f6c6a3a05480146fe0fd8189bbeac7862bf9",
      "parents": [
        "c24c720b6135a8f7975bf9af265124eee2d464cb"
      ],
      "author": {
        "name": "Josh Guilfoyle",
        "email": "jasta00@gmail.com",
        "time": "Sun Aug 16 09:44:40 2009 -0700"
      },
      "committer": {
        "name": "Josh Guilfoyle",
        "email": "jasta00@gmail.com",
        "time": "Sun Aug 16 11:26:57 2009 -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 to\nuse when not explicitly set in the manifest.\n"
    },
    {
      "commit": "33f0e786bb35ea11da1e3d1746c431da5f1d93eb",
      "tree": "3c0e1fda7a739411e8f7ec3854b583425e171687",
      "parents": [
        "57272ba82e3e1baa2bd7743d799f7dbc2acd43f8"
      ],
      "author": {
        "name": "Mike Lockwood",
        "email": "lockwood@android.com",
        "time": "Tue Jul 14 15:23:39 2009 -0400"
      },
      "committer": {
        "name": "Mike Lockwood",
        "email": "lockwood@android.com",
        "time": "Tue Jul 14 15:23:39 2009 -0400"
      },
      "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"
    },
    {
      "commit": "57272ba82e3e1baa2bd7743d799f7dbc2acd43f8",
      "tree": "5f7efde48b48b194d47a9c8389be8bf2eca7a1c9",
      "parents": [
        "0125ae2fda18deee89dc94b32a2daa1b37a8a361"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 18:06:22 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:51:13 2009 -0700"
      },
      "message": "manifest: Support --upgrade to submodule format, from XML\n\nBy running `repo manifest --uprade` an administrator can update the\ncurrent manifest format from the XML format to submodule format, but\nwe need all projects to be checked out in a work tree for this to\nfunction correctly.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "0125ae2fda18deee89dc94b32a2daa1b37a8a361",
      "tree": "db0d0af58d10cb0cdb709fc604732f2454f0ab78",
      "parents": [
        "a7ce096047a7707edc572de375b700d161b9520b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 18:05:23 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:50:52 2009 -0700"
      },
      "message": "Introduce manifest format using git submodules\n\nIf a manifest top level directory contains \u0027.gitmodules\u0027 we now\nassume this is a git module format manifest and switch to using\nthat code, rather than the legacy XML based manifest.\n\nAt the same time, we move the bare repository for a project from\n$TOP/.repo/projects/$REPO_PATH.git to be $REPO_NAME.git instead.\nThis makes it easier for us to later support a repo init from an\nexisting work tree, as we can more accurately predict the path of\nthe project\u0027s repository in the workspace.  It also means that the\n$TOP/.repo/projects/ directory is layed out like a mirror would be.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a7ce096047a7707edc572de375b700d161b9520b",
      "tree": "343563212fe4fe24de905685038ede22d8e9e5e8",
      "parents": [
        "87bda12e85ffb98778d7ac881edb0210b74c0491"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 18:04:27 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:50:52 2009 -0700"
      },
      "message": "Allow meta projects to be created not under .repo/\n\nSome types of manifests might prefer to put their meta project work\ntree under topdir, rather than inside of the .repo/ directory.  We\ncan support that by allowing relpath to be optionally passed in.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "87bda12e85ffb98778d7ac881edb0210b74c0491",
      "tree": "ccdbd92a16ccb4fe9409ee5b864c0e02412e942a",
      "parents": [
        "5f947bba69de81f58f1adef10225c04727fa0ed5"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 16:37:30 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:50:52 2009 -0700"
      },
      "message": "sync: Support upgrading manifest formats\n\nIf the manifest format changes during init or sync we need to do\na full reparse of the manifest, and possibly allow the new object\nto reconfigure the local workspace to match its expectations.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "5f947bba69de81f58f1adef10225c04727fa0ed5",
      "tree": "96da97d3e570c4b2238c807700060c144b333d09",
      "parents": [
        "b3d2c9214be60f575d64b3af3b87a3632de04ba0"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 17:24:17 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:50:52 2009 -0700"
      },
      "message": "init: add -o, --origin to name manifest remote\n\nThe -o option permits the user to control the name of the manifest\u0027s\nremote, which normally is hardcoded to be \u0027origin\u0027, but can differ\nbecause we derive it at runtime from the configuration file.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b3d2c9214be60f575d64b3af3b87a3632de04ba0",
      "tree": "48b9b764f2f8ccf43adb8e470dd893e557a27f10",
      "parents": [
        "7354d8891480f5eaa535acc38a24f42ea63b18a6"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 17:24:45 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:50:52 2009 -0700"
      },
      "message": "init (wrapper): Note that -m is now deprecated\n\nIf the manifest format isn\u0027t XML, this option isn\u0027t available.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "7354d8891480f5eaa535acc38a24f42ea63b18a6",
      "tree": "d8e9f479a031563f7dede6ed2402c81bebfb97f3",
      "parents": [
        "ce86abbe8ab9389fbad9d375e3754ed054d8b744"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:06:13 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:50:52 2009 -0700"
      },
      "message": "init: Ensure repo.mirror is noticed once set\n\nIf we don\u0027t clear the cache, there can be a timestamp race between\nthe pickle file and the raw text file, and we may not pick up the\nedit when we create a new config object around the same path name.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ce86abbe8ab9389fbad9d375e3754ed054d8b744",
      "tree": "07f97c93055b8743dd4db0848ad0fb1d05ddbac6",
      "parents": [
        "75b87c8a5171b26947d0a13d970f09defac736e3"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 16:52:28 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:03:38 2009 -0700"
      },
      "message": "Allow the manifest to be accessed it if is in work tree\n\nIf the manifest\u0027s work tree is actually inside of the rest of\nthe client work tree then its only fair that we include it as\na project that the user can access.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "75b87c8a5171b26947d0a13d970f09defac736e3",
      "tree": "b8d3eb561b8faa2d3fc73e04d402128fdca1b8b3",
      "parents": [
        "abb7a3dfecdfe98b30594219f24c5c3d5e11e990"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 16:24:57 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:03:38 2009 -0700"
      },
      "message": "Abstract manifest branch creation from init to the manifest object\n\nThis permits the XML style manifest to use \u0027default\u0027, while other\ntypes can use their own creation strategy for the current branch.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "abb7a3dfecdfe98b30594219f24c5c3d5e11e990",
      "tree": "eeec9afdd3f3b42101d436d21e1e802b419c5e74",
      "parents": [
        "cc6c79643e1cafad565424caabe581e7b548bf6f"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 16:16:18 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:03:38 2009 -0700"
      },
      "message": "Allow callers to request a specific type of manifest\n\nIf the caller knows exactly what the manifest type must be we\ncan now ask the loader to directly construct that type, rather\nthan guessing it from the working directory.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "cc6c79643e1cafad565424caabe581e7b548bf6f",
      "tree": "29fe305852e0488f54548e1d2a9d3e39f8d39f85",
      "parents": [
        "2095179beec754d2d5bfe175215e736b7ff838e9"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 15:29:02 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:03:38 2009 -0700"
      },
      "message": "Make refs/remotes/m management the manifest object\u0027s responsibility\n\nI plan to have the new submodule manifest format use a different\nlayout for the m refs than the XML manifest format has used in\nthe past.  Thus we need to move the behavior management into the\nmanifest object, and out of the project, so we can change it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2095179beec754d2d5bfe175215e736b7ff838e9",
      "tree": "6cb3048cc2c7f7f011f24f6a0f529f93f221cd02",
      "parents": [
        "b0ca41e19ad0631d82194405d992a7a3b4a834fc"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 15:26:17 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:03:38 2009 -0700"
      },
      "message": "Cleanup import formatting in manifest_xml.py\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "b0ca41e19ad0631d82194405d992a7a3b4a834fc",
      "tree": "2e8d73572c88d4a87d70469a082fe0a7a98502d4",
      "parents": [
        "1875ddd47c0bf38e5cc52e1e5875caabce2d8742"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:01:47 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 20:03:38 2009 -0700"
      },
      "message": "Only remove a stale pickle file if it exists\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1875ddd47c0bf38e5cc52e1e5875caabce2d8742",
      "tree": "cfa269cd610a1e569cd3b3b5e0d3a92675d74a7d",
      "parents": [
        "446c4e5556a4c85621d61b3aba63d084300c6224"
      ],
      "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": "Fri Jul 03 16:39:19 2009 -0700"
      },
      "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"
    },
    {
      "commit": "446c4e5556a4c85621d61b3aba63d084300c6224",
      "tree": "6a4e588e7fd73b1e714e2cc4f746a9ec915ae228",
      "parents": [
        "67f4563acb58af9e64fbfe8a2c9794b389a3debc"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 18:14:04 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 11:00:16 2009 -0700"
      },
      "message": "init: Allow -m only on XML formatted manifest\n\nIf the manifest is the newer SubmoduleManifest style, then the -m\noption makes no sense, as you cannot select a specific file within\nthe current branch.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "67f4563acb58af9e64fbfe8a2c9794b389a3debc",
      "tree": "a605caa0f310a024aa88a68a50c9a00360a5427a",
      "parents": [
        "050e4fd591537811e6e62b2e9ba1ce83e520e550"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 18:17:51 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 11:00:16 2009 -0700"
      },
      "message": "manifest: Only support -o option on XML formatted manifest\n\nIf the manifest isn\u0027t a single file format manifest, the -o option\nmakes no sense, as you cannot export multiple files to a single\nstream for display or redirection.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "050e4fd591537811e6e62b2e9ba1ce83e520e550",
      "tree": "05ca13bcc8713675eba7c896f7e75e1cb76e1bbb",
      "parents": [
        "60e679209a5495393ef584efaaad287fc8b77c51"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 03 14:16:14 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 11:00:16 2009 -0700"
      },
      "message": "manifest: Only display XML help on XML manifest\n\nSome of the help text is only related to the XML formatted manifest,\nso only display that text if that is the current format.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "60e679209a5495393ef584efaaad287fc8b77c51",
      "tree": "11aebc3d30a82685da22fe8b315cff15270a6ddf",
      "parents": [
        "f1a6b14fdc5402f9ed765a8a342d9c07c5b91e2d"
      ],
      "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": "Fri Jul 03 11:00:16 2009 -0700"
      },
      "message": "help: Don\u0027t show empty Summary or Description sections\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f1a6b14fdc5402f9ed765a8a342d9c07c5b91e2d",
      "tree": "f67b0e4fdb68bf3466202a27d5a0732edf424812",
      "parents": [
        "ca3d8ff4fc7bac11a747e4f32a81b42a01f4f297"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 03 16:01:11 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 11:00:16 2009 -0700"
      },
      "message": "Create an abstract Manifest base class\n\nThis will help as we add support for another manifest type.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ca3d8ff4fc7bac11a747e4f32a81b42a01f4f297",
      "tree": "bbec403fcb9a01044b32149ad18de426660af3c2",
      "parents": [
        "98ea26b8d842d11afe6326f026ba15644dc40770"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 04 19:49:36 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 11:00:16 2009 -0700"
      },
      "message": "Teach Project how to relink a .git/ in the work tree\n\nThe _LinkWorkTree method can now be used to relink the work tree,\nsuch as if the real repository was moved to a different location\non disk.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "98ea26b8d842d11afe6326f026ba15644dc40770",
      "tree": "e78cc2f8669d24d8c5078239d1aef3964da21c2b",
      "parents": [
        "c24c720b6135a8f7975bf9af265124eee2d464cb"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 04 19:19:11 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jul 03 11:00:16 2009 -0700"
      },
      "message": "Allow callers to reset the git config cache\n\nIf commands modify the git config too rapidly we might not notice\nthe .git/config file has been modified, as they could run in the\nsame filesystem timestamp window and thus not cause a change on\nthe config\u0027s mtime.  This can cause repo to miss re-reading the\nconfig file after running a command.\n\nAllowing the cache to be flushed forces us to re-read the config.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c24c720b6135a8f7975bf9af265124eee2d464cb",
      "tree": "c1460ab9ad60850aed68b25ba6d98a931adc352e",
      "parents": [
        "2d1a3968971366fab7000664959a2d5a39b48996"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 16:12:57 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 16:12:57 2009 -0700"
      },
      "message": "Fix error parsing a non-existant configuration file\n\nIf a file (e.g. ~/.gitconfig) does not exist, we get None\nhere rather than a string.  NoneType lacks rstrip() so we\ncannot strip it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2d1a3968971366fab7000664959a2d5a39b48996",
      "tree": "1ddc4efeb0c045d32f25716021b1d017e3447bc4",
      "parents": [
        "1dcb58a7d0f07bf358ba485733580413ebe2478b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 13:18:42 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 13:18:55 2009 -0700"
      },
      "message": "Document how to contribute to the repo project\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "1dcb58a7d0f07bf358ba485733580413ebe2478b",
      "tree": "d6aba27e0585a06d103cf859339f5bdb5c4f101a",
      "parents": [
        "37dbf2bf0fa799530052ffd010dadbd4c01b7746"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 12:45:47 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 12:45:47 2009 -0700"
      },
      "message": "Support GIT_EDITOR\u003d\u0027vim -c \"set textwidth\u003d80\"\u0027\n\nIf there are shell special characters in the editor string, we must\nuse /bin/sh to parse and execute it, rather than trying to rely on\na simple split(\u0027 \u0027).  This avoids vim starting up with two empty\nbuffers, due to a misparsed command line.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "37dbf2bf0fa799530052ffd010dadbd4c01b7746",
      "tree": "9e9be8619020ba6b6de2bc28ba5da94fa69e6188",
      "parents": [
        "438c54713a7ca56fba2a7985b6563aa076b17169"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 10:53:04 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jul 02 10:53:04 2009 -0700"
      },
      "message": "Try to prevent \u0027repo sync\u0027 as a user name\n\nWhen someone copies and pastes a setup line from a web page,\nthey might actually copy \u0027repo sync\u0027 onto the clipboard and wind\nup pasting it into the \"Your Name\" prompt.  This means they will\ninitialize their client with the user name of \"repo sync\", creating\nsome rather funny looking commits later on.  For example:\n\n  To setup your source tree:\n\n    mkdir ~/code\n    cd ~/code\n    repo init -u git://....\n    repo sync\n\nIf this entire block was just blindly copy and pasted into the\nterminal, the shell won\u0027t read \"repo sync\" but \"repo init\" will.\n\nBy showing the user their full identity string, and asking them\nto confirm it before we continue, we can give the hapless user a\nchance to recover from this mistake, without unfairly harming those\nwho were actually named \u0027repo\u0027 by their parents.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "438c54713a7ca56fba2a7985b6563aa076b17169",
      "tree": "cdb2d8cfd5e05d3659f9b7bc9c5a5191d322df5f",
      "parents": [
        "e020ebee4e3e4e2ddefd72d41ac0035e6d528725"
      ],
      "author": {
        "name": "David Aguilar",
        "email": "davvid@gmail.com",
        "time": "Sun Jun 28 15:09:16 2009 -0700"
      },
      "committer": {
        "name": "David Aguilar",
        "email": "davvid@gmail.com",
        "time": "Mon Jun 29 00:24:36 2009 -0700"
      },
      "message": "git_config: handle configuration entries with no values\n\nA git-config entry with no value was preventing repo\nfrom initializing.  This modifies _ReadGit() to handle\nconfig entries with empty values.\n\nSigned-off-by: David Aguilar \u003cdavvid@gmail.com\u003e\nReported-by: Josh Guilfoyle \u003cjasta00@gmail.com\u003e\n"
    },
    {
      "commit": "e020ebee4e3e4e2ddefd72d41ac0035e6d528725",
      "tree": "0e98ff750c6984fd24146fc0b96a4e8865b35e17",
      "parents": [
        "21c5c34ee28036e595aab3cfc72e58c6c8f526b3"
      ],
      "author": {
        "name": "David Aguilar",
        "email": "davvid@gmail.com",
        "time": "Sun Jun 28 15:08:56 2009 -0700"
      },
      "committer": {
        "name": "David Aguilar",
        "email": "davvid@gmail.com",
        "time": "Sun Jun 28 15:08:56 2009 -0700"
      },
      "message": ".gitignore: add an entry for repopickles\n\nSigned-off-by: David Aguilar \u003cdavvid@gmail.com\u003e\n"
    },
    {
      "commit": "21c5c34ee28036e595aab3cfc72e58c6c8f526b3",
      "tree": "f40717343efa47e15535172cf0b4bf776a870891",
      "parents": [
        "54fccd71fbdc60adf99b9a9bf4712c121d4312ba"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 25 16:47:30 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 25 16:47:30 2009 -0700"
      },
      "message": "Support detached HEAD in manifest repository\n\nIf the manifest repository is on a detached HEAD and we are parsing\nan XML formatted manifest we should simply set the branch property\nto None, rather than crash with an AttributeError.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "54fccd71fbdc60adf99b9a9bf4712c121d4312ba",
      "tree": "d51eb84344c0433e12335b1000ce3526b1368cf8",
      "parents": [
        "fb5c8fd948dea211cd8f43477855de44c273a1bf"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 24 07:09:51 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 24 07:15:21 2009 -0700"
      },
      "message": "Document any crashes from the user\u0027s text editor\n\nRather than failing with no information, display the child exit\nstatus and the command line we tried to use to edit a text file.\nThere may be some useful information to help understand the crash.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    }
  ],
  "next": "fb5c8fd948dea211cd8f43477855de44c273a1bf"
}
