)]}'
{
  "log": [
    {
      "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "7da73d6f3ba579c67e58499b785dc4ac5beb9391",
      "tree": "d23bc6178fbd43b4ef904d8fcf9f5db318d56209",
      "parents": [
        "f0d4c36701613dc9c305208d81b139208e40414c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 17:35:43 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 17:35:43 2009 -0700"
      },
      "message": "branches: Describe output format in `repo help branches`\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "f0d4c36701613dc9c305208d81b139208e40414c",
      "tree": "e33abb1c63aeacd3160aad4301025b4cde056208",
      "parents": [
        "2ec00b92724982708071dc0eed707659468d2bcf"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 09:33:48 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 09:33:48 2009 -0700"
      },
      "message": "grep: Only use --color on git 1.6.3 and later\n\nThe --color flag wasn\u0027t introduced until git 1.6.3.  Prior to that\nversion, `git grep --color` just produces a fatal error, as it is\nan unsupported option.  Since this is just pretty output and is not\ncritical to execution, we can simply omit the option if the version\nof git we are running on doesn\u0027t support it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "2ec00b92724982708071dc0eed707659468d2bcf",
      "tree": "4af657b8164ea30575b99852a60012ea9ad8e24e",
      "parents": [
        "2a3a81b51f1aee5a2da789d07d14cde61c96e8b7"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 09:32:50 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Jun 12 09:32:50 2009 -0700"
      },
      "message": "Refactor git version detection for reuse\n\nThis way we can use it to detect feature support in the underlying\ngit, such as new options or commands that have been added in more\nrecent versions.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "9fb29ce123ad26bf1497144a40e337aff8c51ecb",
      "tree": "f23b28c647529b40532f2e5bb7a39c7b3af7ec81",
      "parents": [
        "3a68bb4c7f50897c0dbca59ca47aef463a9ad8d0"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 04 20:41:02 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 04 20:41:26 2009 -0700"
      },
      "message": "sync: Keep the project.list file sorted\n\nIts easier to locate an entry visually if the file is sorted.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3a68bb4c7f50897c0dbca59ca47aef463a9ad8d0",
      "tree": "7d469d0d1c996106fa5a90747ee644f7bcda881e",
      "parents": [
        "cd1d7ff81e0b4ab481f83ff883505dbf2442d5be"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 04 16:18:09 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 04 16:21:01 2009 -0700"
      },
      "message": "sync: Tolerate blank lines in project.list\n\nIf a line is blank in project.list, its not a relevant project path,\nso skip over it.  Existing project.list files may have blank lines if\nsync was run with no projects at all, and the file was created empty.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "cd1d7ff81e0b4ab481f83ff883505dbf2442d5be",
      "tree": "e3240e2f0faea4c065f00b0fb07487d2b9747e31",
      "parents": [
        "da88ff4411e02225a6d511666ed82f7f9711a752"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 04 16:15:53 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Jun 04 16:20:02 2009 -0700"
      },
      "message": "sync: Don\u0027t process project.list in a mirror\n\nWe have no working tree, so we cannot update the project.list\nstate file, nor should we try to delete a directory if a project is\nremoved from the manifest.  Clients would still need the repository\nfor historical records.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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"
    }
  ],
  "next": "4259b8a2ac0dddb54e98e00afc454bf966d4f058"
}
