)]}'
{
  "log": [
    {
      "commit": "351fe2c793437e1d8a0b222f8478c74cf60ae034",
      "tree": "9eb3b9ada1de282765919e083c49f06295a42f30",
      "parents": [
        "fb99c719390196e35c27f30f875c1b796c307585"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Sep 25 17:54:26 2013 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Sep 25 19:12:13 2013 +0900"
      },
      "message": "Sync: Improved error message when manifest server RPC call fails\n\nWhen the RPC call fails, the error message returned by the server\nis printed, but it is not obvious that this is caused by RPC call\nfailure.\n\nPrefix the error message with a descriptive message that explains\nwhat went wrong.\n\nChange-Id: I4b77af22aacc2e9843c4df9d06bf54e41d9692ff\n"
    },
    {
      "commit": "fb99c719390196e35c27f30f875c1b796c307585",
      "tree": "2dbe72ac9fed4f4b2376e029c6268993d5f74a8c",
      "parents": [
        "bc0308478bc98d9b14d0b8f79ad030f474adcc6f"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Sep 25 11:09:34 2013 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Sep 25 19:12:06 2013 +0900"
      },
      "message": "Sync: Print name of manifest server used for smart sync/smart tag\n\nWhen syncing using smart sync or smart tag mode, print the url of\nthe manifest server that is being used.\n\nThis is useful in organisations that have multiple manifest servers\nused in different manifest branches.\n\nChange-Id: Ib5bc2de5af6f4a942d0ef735c65cbc0721059a61\n"
    },
    {
      "commit": "854f2b6ef4f9ea1c304b2e77d552b930b28e7053",
      "tree": "17c26004548ed39b2cfee350a63fe283148b445a",
      "parents": [
        "db2ad9dfce438dae14fed0a62b37f0028ee98ad1",
        "a892b1006b5b7193262f3783b9678e2c76978a9b"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Jun 11 13:58:47 2013 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Jun 11 13:58:47 2013 +0000"
      },
      "message": "Merge \"sync: assign manifest_name earlier\""
    },
    {
      "commit": "a892b1006b5b7193262f3783b9678e2c76978a9b",
      "tree": "b5834be69d2578788a314e269f684bc86d8d8e6b",
      "parents": [
        "ef668c92c2c87c45df02bf1609a89e4479bbb30c"
      ],
      "author": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Tue Jun 11 14:18:46 2013 +0530"
      },
      "committer": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Tue Jun 11 14:18:58 2013 +0530"
      },
      "message": "sync: assign manifest_name earlier\n\n* manifest_name was never set if opt.smart_sync or opt.smart_tag is used.\n* Set it earlier, so that the code handles it correctly when it is None.\n* An UnboundLocalError is raised if running `repo sync` without any options:\n  local variable \u0027manifest_name\u0027 referenced before assignment\n* This fixes the above regression caused by commit\n  53a6c5d93a8ba708208826dab64c55fe97f06d0b\n\nChange-Id: I57086670f3589beea8461ce0344f6ec47ab85b7b\n"
    },
    {
      "commit": "db2ad9dfce438dae14fed0a62b37f0028ee98ad1",
      "tree": "6f2dc2aef2456c75759cfe9c845a9d4064ff8bc3",
      "parents": [
        "ef668c92c2c87c45df02bf1609a89e4479bbb30c"
      ],
      "author": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Tue Jun 11 13:42:25 2013 +0530"
      },
      "committer": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Tue Jun 11 08:21:10 2013 +0000"
      },
      "message": "Fix urllib.parse (urlparse) handling\n\nRevert \"Fix \"\u0027module\u0027 object is not callable\" error\", and fix it properly.\n\n* The urlparse module is renamed to urllib.parse in Python 3.\n* This commit fixes the code to use \"urllib.parse.urlparse\"\n  instead of creating a new module urlib and setting\n  urlib.parse to urlparse.urlparse.\n* Fixes an AttributeError:\n  \u0027function\u0027 object has no attribute \u0027uses_relative\u0027\n\nThis reverts commit cd51f17c643370e6199216462c1be36f04d57291.\n\nChange-Id: I48490b20ecd19cf5a6edd835506ea5a467d556ac\n"
    },
    {
      "commit": "65b162b32fccee038ea331ea47706c4c2ef52692",
      "tree": "080bc21551d03b899dadd480c8be8833a82237de",
      "parents": [
        "53a6c5d93a8ba708208826dab64c55fe97f06d0b",
        "cd51f17c643370e6199216462c1be36f04d57291"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Jun 10 14:31:30 2013 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Jun 10 14:31:30 2013 +0000"
      },
      "message": "Merge \"Fix \"\u0027module\u0027 object is not callable\" error\""
    },
    {
      "commit": "cd51f17c643370e6199216462c1be36f04d57291",
      "tree": "8ab1624ac46d6adbac6ca3c25d3d716aff251776",
      "parents": [
        "c2791e85f322bb7d5007ee7e673134d5fa2ed662"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Jun 06 19:06:16 2013 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Sat Jun 08 14:50:41 2013 +0900"
      },
      "message": "Fix \"\u0027module\u0027 object is not callable\" error\n\nIn a couple of files the urlparse method was not being set up\ncorrectly for python \u003c 3 and this resulted in an error being\nthrown when trying to call it.\n\nChange-Id: I4d2040ac77101e4e228ee225862f365ae3d96cec\n"
    },
    {
      "commit": "53a6c5d93a8ba708208826dab64c55fe97f06d0b",
      "tree": "3500926383ccb256d6d2f76939fc160db80c0665",
      "parents": [
        "c2791e85f322bb7d5007ee7e673134d5fa2ed662"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonymobile.com",
        "time": "Tue Mar 19 12:20:52 2013 +0100"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Sat Jun 08 14:31:58 2013 +0900"
      },
      "message": "Degrade: Fix smart sync/smart tag\n\nThis was broken in b2bd91c, which updated the manifest after it had\nbeen overridden, which made it fall back to the original file (and\nnot the one from the manifest server).\n\nThis builds on 0766900 and overrides the manifest by the one\ndownloaded from the manifest server completely.\n\nChange-Id: Ic3972390a68919b614616631d99c9e7a63c0e0db\n"
    },
    {
      "commit": "59bbb580e34bbc5dce76dacaad9ff94f21fa396f",
      "tree": "4d19216215edc174851baa10a00a3bccba9d4e45",
      "parents": [
        "da45e5d8848246cddbce80ff56786bd7330ba5af"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Fri May 17 10:49:33 2013 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu May 23 07:28:53 2013 +0000"
      },
      "message": "Move Python version checking to a separate module\n\nAdd a new module with methods for checking the Python version.\n\nInstead of handling Python3 imports with try...except blocks, first\ncheck the python version and then import the relevant modules.  This\nmakes the code a bit cleaner and will result in less diff when/if we\nremove support for Python \u003c 3 later.\n\nUse the same mechanism to handle `input` vs. `raw_input` and add\nsuppression of pylint warnings caused by redefinition of the built-in\nmethod `input`.\n\nChange-Id: Ia403e525b88d77640a741ac50382146e7d635924\nAlso-by: Chirayu Desai \u003ccdesai@cyanogenmod.org\u003e\nSigned-off-by: Chirayu Desai \u003ccdesai@cyanogenmod.org\u003e\n"
    },
    {
      "commit": "217ea7d2747e3098009afe0b389fc4b45f55ea5a",
      "tree": "4ea2663a01fb22002ec6cd6ede9cb3babd89a692",
      "parents": [
        "fef4ae74e26efecf5c803793351b6c843eab4970"
      ],
      "author": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Fri Mar 01 19:14:38 2013 +0530"
      },
      "committer": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Thu Apr 18 21:35:49 2013 +0530"
      },
      "message": "Some fixes for supporting python3\n\n* Fix imports.\n* Use python3 syntax.\n* Wrap map() calls with list().\n* Use list() only wherever needed.\n  (Thanks Conley!)\n* Fix dictionary iteration methods\n  (s/iteritems/items/).\n* Make use of sorted() in appropriate places\n* Use iterators directly in the loop.\n* Don\u0027t use .keys() wherever it isn\u0027t needed.\n* Use sys.maxsize instead of sys.maxint\n\nTODO:\n* Make repo work fully with python3. :)\n\nSome of this was done by the \u00272to3\u0027 tool [1], by\napplying the needed fixes in a way that doesn\u0027t\nbreak compatibility with python2.\n\nLinks:\n[1]: http://docs.python.org/2/library/2to3.html\n\nChange-Id: Ibdf3bf9a530d716db905733cb9bfef83a48820f7\nSigned-off-by: Chirayu Desai \u003ccdesai@cyanogenmod.org\u003e\n"
    },
    {
      "commit": "fef4ae74e26efecf5c803793351b6c843eab4970",
      "tree": "f5d53b6aad19cd6c514b9c3e10e050a1d1f6cb18",
      "parents": [
        "db83b1b5abcc2df1b5c7a76ca74ff60e88fe956e"
      ],
      "author": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Fri Apr 12 14:54:32 2013 +0530"
      },
      "committer": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Mon Apr 15 13:38:49 2013 +0530"
      },
      "message": "sync: be more verbose\n\n* Print project name if the \"quiet\" option is not used.\n\nChange-Id: I99863bb50f66e4dcbaf2d170bdd05971f2a4e19a\nSigned-off-by: Chirayu Desai \u003ccdesai@cyanogenmod.org\u003e\n"
    },
    {
      "commit": "07669002cbc1cdb3f5587660a140b3203b7fb552",
      "tree": "ad652eff3898e0961562e085f230e53d7d476349",
      "parents": [
        "3cba0b8613b2fd56eb2c78b6f94c26ac26704bd0"
      ],
      "author": {
        "name": "Tim Kilbourn",
        "email": "tkilbourn@google.com",
        "time": "Fri Mar 08 15:02:49 2013 -0800"
      },
      "committer": {
        "name": "Tim Kilbourn",
        "email": "tkilbourn@google.com",
        "time": "Fri Mar 08 16:19:03 2013 -0800"
      },
      "message": "Reload the correct manifest during sync.\n\nFix for issue #134\nhttps://code.google.com/p/git-repo/issues/detail?id\u003d134\n\nChange-Id: I94c2dea5dd63917e3f9c90cbd628921d7d61b12a\n"
    },
    {
      "commit": "2f9e7e40c44acae37d0c263c212956ef6038c35b",
      "tree": "b5bffccb2c4f6a502a350bef3e40183f56ca8bc9",
      "parents": [
        "45d21685b93f80b67239849b2d2cfe6b217e335a"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Mar 05 17:26:46 2013 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Mar 05 17:30:59 2013 +0900"
      },
      "message": "Fix: Missing spaces in printed messages\n\nSeveral messages are printed with the `print` method and the message\nis split across two lines, i.e.:\n\n print(\u0027This is a message split\u0027\n       \u0027across two source code lines\u0027)\n\nWhich causes the message to be printed as:\n\n This is a message splitacross two source code lines\n\nAdd a space at the end of the first line before the line break:\n\n print(\u0027This is a message split \u0027\n       \u0027across two source code lines\u0027\n\nAlso correct a minor spelling mistake.\n\nChange-Id: Ib98d93fcfb98d78f48025fcc428b6661380cff79\n"
    },
    {
      "commit": "597868b4c45bba380249b739c0cf49b868cc8741",
      "tree": "938a73ec3df796449207c695a4ee316d4886b0fe",
      "parents": [
        "75b4c2deac9ff23a5a3c24b3d2450cd23ae3d705"
      ],
      "author": {
        "name": "Mitchel Humpherys",
        "email": "mitchelh@codeaurora.org",
        "time": "Mon Oct 29 10:18:34 2012 -0700"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Feb 27 11:00:49 2013 +0900"
      },
      "message": "Add --no-tags option to prevent fetching of tags\n\nAdd an option to pass `--no-tags\u0027 to `git fetch\u0027.\n\nChange-Id: I4158cc369773e08e55a167091c38ca304a197587\nSigned-off-by: Mitchel Humpherys \u003cmitchelh@codeaurora.org\u003e\n"
    },
    {
      "commit": "7bdbde7af84036d2d900150e67f462e1a50f4b0e",
      "tree": "399f7adf345ce5cf195b786939765b6b98ce9bc6",
      "parents": [
        "b2bd91c99b9435cf950ecf8efbb8439f31d3fcbc"
      ],
      "author": {
        "name": "Torne (Richard Coles)",
        "email": "torne@google.com",
        "time": "Wed Dec 05 10:58:06 2012 +0000"
      },
      "committer": {
        "name": "Torne (Richard Coles)",
        "email": "torne@google.com",
        "time": "Wed Dec 05 11:01:36 2012 +0000"
      },
      "message": "Allow sync to run even when the manifest is broken.\n\nIf the current manifest is broken then \"repo sync\" fails because it\ncan\u0027t retrieve the default value for --jobs. Use 1 in this case, in\norder that you can \"repo sync\" to get a fixed manifest (assuming someone\nfixed it upstream).\n\nChange-Id: I4262abb59311f1e851ca2a663438a7e9f796b9f6\n"
    },
    {
      "commit": "b2bd91c99b9435cf950ecf8efbb8439f31d3fcbc",
      "tree": "5d26d3943317c11c1cd913fc5640074a5bc7910b",
      "parents": [
        "3f5ea0b18207a81f58595b1a2e10e5ffb784b74f"
      ],
      "author": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Wed Jan 11 11:28:42 2012 +0800"
      },
      "committer": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Mon Nov 19 10:45:21 2012 -0800"
      },
      "message": "Represent git-submodule as nested projects, take 2\n\n(Previous submission of this change broke Android buildbot due to\n incorrect regular expression for parsing git-config output.  During\n investigation, we also found that Android, which pulls Chromium, has a\n workaround for Chromium\u0027s submodules; its manifest includes Chromium\u0027s\n submodules.  This new change, in addition to fixing the regex, also\n take this type of workarounds into consideration; it adds a new\n attribute that makes repo not fetch submodules unless submodules have a\n project element defined in the manifest, or this attribute is\n overridden by a parent project element or by the default element.)\n\nWe need a representation of git-submodule in repo; otherwise repo will\nnot sync submodules, and leave workspace in a broken state.  Of course\nthis will not be a problem if all projects are owned by the owner of the\nmanifest file, who may simply choose not to use git-submodule in all\nprojects.  However, this is not possible in practice because manifest\nfile owner is unlikely to own all upstream projects.\n\nAs git submodules are simply git repositories, it is natural to treat\nthem as plain repo projects that live inside a repo project.  That is,\nwe could use recursively declared projects to denote the is-submodule\nrelation of git repositories.\n\nThe behavior of repo remains the same to projects that do not have a\nsub-project within.  As for parent projects, repo fetches them and their\nsub-projects as normal projects, and then checks out subprojects at the\ncommit specified in parent\u0027s commit object.  The sub-project is fetched\nat a path relative to parent project\u0027s working directory; so the path\nspecified in manifest file should match that of .gitmodules file.\n\nIf a submodule is not registered in repo manifest, repo will derive its\nproperties from itself and its parent project, which might not always be\ncorrect.  In such cases, the subproject is called a derived subproject.\n\nTo a user, a sub-project is merely a git-submodule; so all tips of\nworking with a git-submodule apply here, too.  For example, you should\nnot run `repo sync` in a parent repository if its submodule is dirty.\n\nChange-Id: I4b8344c1b9ccad2f58ad304573133e5d52e1faef\n"
    },
    {
      "commit": "8f62fb7bd305337994bced7d23b347d0d39f5faf",
      "tree": "7a00915a4e6138fe2c12d6f8d181b623df8962a2",
      "parents": [
        "c1b86a232383748811c6faf17f364e63e10f7dd4"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 12:09:38 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 12:09:38 2012 +0900"
      },
      "message": "Tidy up code formatting a bit more\n\nEnable the following Pylint warnings:\n\n  C0322: Operator not preceded by a space\n  C0323: Operator not followed by a space\n  C0324: Comma not followed by a space\n\nAnd make the necessary fixes.\n\nChange-Id: I74d74283ad5138cbaf28d492b18614eb355ff9fe\n"
    },
    {
      "commit": "c1b86a232383748811c6faf17f364e63e10f7dd4",
      "tree": "8f28c8e8a922ffd4165f48a1988500070936bd39",
      "parents": [
        "98ffba1401056e2d88d3f3898b6fbf5d7d3931a4"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 11:36:51 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 11:38:57 2012 +0900"
      },
      "message": "Fix inconsistent indentation\n\nThe repo coding style is to indent at 2 characters, but there are\nmany places where this is not followed.\n\nEnable pylint warning \"W0311: Bad indentation\" and make sure all\nindentation is at multiples of 2 characters.\n\nChange-Id: I68f0f64470789ce2429ab11104d15d380a63e6a8\n"
    },
    {
      "commit": "cecd1d864fc3cf02cf50d367111e0d0e173c5dc6",
      "tree": "b4f660400560dce21cd7a00ffe5a5d74b54bcb81",
      "parents": [
        "fc241240d828d7e8302dc0876608a9d27ae1cbc7"
      ],
      "author": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Thu Nov 01 22:59:27 2012 -0700"
      },
      "committer": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Tue Nov 13 17:33:56 2012 -0800"
      },
      "message": "Change print statements to work in python3\n\nThis is part of a series of changes to introduce Python3 support.\n\nChange-Id: I373be5de7141aa127d7debdbce1df39148dbec32\n"
    },
    {
      "commit": "8d070cfb254a21ec3f7a07c123165edf1ce379eb",
      "tree": "6d74d599c13bf8c8591d777198cb04b0646c7722",
      "parents": [
        "e072a92a9bb9fdf61bbd1df4e8864f8fd52d5a82"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Tue Nov 06 13:14:31 2012 -0800"
      },
      "committer": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Tue Nov 06 13:14:31 2012 -0800"
      },
      "message": "Always show --manifest-server-* options\n\nThe --manifest-server-* flags broke the smartsync subcmd since\nthe corresponding variables weren\u0027t getting set.  This change\nensures that they will always be set, regardless of whether we are\nusing sync -s or smartsync.\n\nChange-Id: I1b642038787f2114fa812ecbc15c64e431bbb829\n"
    },
    {
      "commit": "e21526754be58523c673d29731ee01d80e0ffc31",
      "tree": "da87019198b421827c9e3cbaecce88077fb76caa",
      "parents": [
        "1d947b30342163b723c96db563967323535fef45"
      ],
      "author": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Wed Oct 31 12:24:38 2012 -0700"
      },
      "committer": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Wed Oct 31 12:27:17 2012 -0700"
      },
      "message": "sync: Only parallelize gc for git \u003e\u003d 1.7.2\n\nThis minimum version is required for the -c argument to set config on\nthe command line. Without this option, git by default uses as many\nthreads per invocation as there are CPUs, so we cannot safely\nparallelize without hosing a system.\n\nChange-Id: I8fd313dd84917658162b5134b2d9aa34a96f2772\n"
    },
    {
      "commit": "1d947b30342163b723c96db563967323535fef45",
      "tree": "b6b02d02df01792b356b9e50ceeaadcaf3a2e8c5",
      "parents": [
        "2d113f35460051823ea54d61c5c939565518f969"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Oct 25 12:23:11 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Oct 30 10:28:20 2012 +0900"
      },
      "message": "Even more coding style cleanup\n\nFixing some more pylint warnings:\n\nW1401: Anomalous backslash in string\nW0623: Redefining name \u0027name\u0027 from outer scope\nW0702: No exception type(s) specified\nE0102: name: function already defined line n\n\nChange-Id: I5afcdb4771ce210390a79981937806e30900a93c\n"
    },
    {
      "commit": "cd81dd6403fc8dbe6ec5920c517d9083902c3c1f",
      "tree": "935f3f82d2eb32c06b812f66d56d138074309ef8",
      "parents": [
        "80d2ceb22267b7dc61b107934ff5264b6439a785"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 26 12:18:00 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 26 12:24:57 2012 -0700"
      },
      "message": "Revert \"Represent git-submodule as nested projects\"\n\nThis reverts commit 69998b0c6ff724bf620480140ccce648fec7d6a9.\nBroke Android\u0027s non-gitmodule use case.\n\nConflicts:\n\tproject.py\n\tsubcmds/sync.py\n\nChange-Id: I68ceeb63d8ee3b939f85a64736bdc81dfa352aed\n"
    },
    {
      "commit": "80d2ceb22267b7dc61b107934ff5264b6439a785",
      "tree": "8d5c31dc12bf71d3d7f707341c413b3c0801a344",
      "parents": [
        "55e4d464a7f8cf366290ba2d3c8bdd8297d71d32"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 26 12:23:05 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Oct 26 12:24:57 2012 -0700"
      },
      "message": "repo selfupdate: Fix _PostRepoUpgrade takes 2 arguments\n\nChange-Id: I1cf9e0674ea366ddce96c949e0bc085e3452b25a\n"
    },
    {
      "commit": "c9129d90deb7377324b5178a231657e3d8c74019",
      "tree": "f0dd3f9ade22e48f4ab9cb8447a360e2e01a5aca",
      "parents": [
        "57365c98cc227255f50ab3d71462204c804eb975"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Oct 01 16:12:28 2012 -0700"
      },
      "committer": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Oct 25 17:48:35 2012 -0700"
      },
      "message": "Update PGP keys during _PostRepoUpgrade in `sync`\n\nPreviously, if a key was added, a client wouldn\u0027t add the key during\nthe sync step.  This would cause issues if a new key were added and a\nsubsequent release were signed by that key.\n\nChange-Id: I4fac317573cd9d0e8da62aa42e00faf08bfeb26c\n"
    },
    {
      "commit": "57365c98cc227255f50ab3d71462204c804eb975",
      "tree": "04ade83292c018ffd23beae5b228e4b6f688530e",
      "parents": [
        "dc96476af37558c8eaf6d25087d4a604612642dd",
        "188572170e8cdf28df55a5ca90ed70d14b72b804"
      ],
      "author": {
        "name": "Shawn Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 25 17:38:05 2012 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Oct 25 17:38:05 2012 -0700"
      },
      "message": "Merge \"sync: Run gc --auto in parallel\""
    },
    {
      "commit": "2577cec0952899040cd8c6523f69ece4cdc005ac",
      "tree": "792f82c975d0d5d039ac3a6c6adc8404d87e8b2c",
      "parents": [
        "e48d34659ebda45431512ab2478558f8e4cdd46c",
        "d947858325ae70ff9c0b2f463a9e8c4ffd00002a"
      ],
      "author": {
        "name": "Shawn Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 25 17:35:15 2012 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Oct 25 17:35:15 2012 -0700"
      },
      "message": "Merge \"sync: Keep a moving average of last fetch times\""
    },
    {
      "commit": "e48d34659ebda45431512ab2478558f8e4cdd46c",
      "tree": "ab38328b72acf6cb6898f2b6ed3cb859c48249fe",
      "parents": [
        "ab8f911a6721424ddc7cda7ebd2a07270a5909b1",
        "67700e9b90a38cc3719c818bc967153e8b7b429e"
      ],
      "author": {
        "name": "Shawn Pearce",
        "email": "sop@google.com",
        "time": "Thu Oct 25 17:33:36 2012 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Oct 25 17:33:36 2012 -0700"
      },
      "message": "Merge \"sync: Order projects according to last fetch time\""
    },
    {
      "commit": "ab8f911a6721424ddc7cda7ebd2a07270a5909b1",
      "tree": "cf4b0cfab756dc78747894189ef918a262811d48",
      "parents": [
        "608aff7f624e35348ff9fab74bad1d6921944238"
      ],
      "author": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Thu Oct 25 13:44:11 2012 -0700"
      },
      "committer": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Thu Oct 25 13:55:49 2012 -0700"
      },
      "message": "Fix pylint warnings introduced by the submodule patch\n\n\"69998b0 Represent git-submodule as nested projects\" has introduced a\nfew pylint warnings.\n\nW0612:1439,8:Project._GetSubmodules.get_submodules: Unused variable \u0027sub_gitdir\u0027\nW0613:1424,36:Project._GetSubmodules.get_submodules: Unused argument \u0027path\u0027\nW0612:1450,25:Project._GetSubmodules.parse_gitmodules: Unused variable \u0027e\u0027\nW0622:516,8:Sync.Execute: Redefining built-in \u0027all\u0027\n\nChange-Id: I84378e2832ed1b5ab023e394d53b22dcea799ba4\n"
    },
    {
      "commit": "608aff7f624e35348ff9fab74bad1d6921944238",
      "tree": "e1bdbb8af5927dd226d8e22dc382fd24c4cdfa5e",
      "parents": [
        "13657c407d0424d0866993bea39ed01094caa1c1",
        "a5be53f9c809009e67f217c00b8f30246aacc237"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Oct 25 10:03:36 2012 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Oct 25 10:03:37 2012 -0700"
      },
      "message": "Merge \"Use modern Python exception syntax\""
    },
    {
      "commit": "188572170e8cdf28df55a5ca90ed70d14b72b804",
      "tree": "d64ad4724552898c9c49ba19f715c74c5caa504c",
      "parents": [
        "091f893625269fd12adadf7d1f60c21b4b83e779"
      ],
      "author": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Tue Oct 23 17:02:59 2012 -0700"
      },
      "committer": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Thu Oct 25 08:12:48 2012 -0700"
      },
      "message": "sync: Run gc --auto in parallel\n\nWe can\u0027t just let this run wild with a high (or even low) -j, since\nthat would hose a system. Instead, limit the total number of threads\nacross all git gc subprocesses to the number of CPUs reported by the\nmultiprocessing module (available in Python 2.6 and above).\n\nChange-Id: Icca0161a1e6116ffa5f7cfc6f5faecda510a7fb9\n"
    },
    {
      "commit": "d947858325ae70ff9c0b2f463a9e8c4ffd00002a",
      "tree": "edf33164dfdd829eae74244198f790629d2fabc8",
      "parents": [
        "67700e9b90a38cc3719c818bc967153e8b7b429e"
      ],
      "author": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Tue Oct 23 16:35:39 2012 -0700"
      },
      "committer": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Wed Oct 24 14:52:07 2012 -0700"
      },
      "message": "sync: Keep a moving average of last fetch times\n\nTry to more accurately estimate which projects take the longest to\nsync by keeping an exponentially weighted moving average (a\u003d0.5) of\nfetch times, rather than just recording the last observation. This\nshould discount individual outliers (e.g. an unusually large project\nupdate) and hopefully allow truly slow repos to bubble to the top.\n\nChange-Id: I72b2508cb1266e8a19cf15b616d8a7fc08098cb3\n"
    },
    {
      "commit": "67700e9b90a38cc3719c818bc967153e8b7b429e",
      "tree": "57768c3936f66cb28b623c13e59c2bc1dba247ff",
      "parents": [
        "5c6eeac8f0350fd6b14cf226ffcff655f1dd9582"
      ],
      "author": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Tue Oct 23 15:00:54 2012 -0700"
      },
      "committer": {
        "name": "Dave Borowitz",
        "email": "dborowitz@google.com",
        "time": "Wed Oct 24 14:51:58 2012 -0700"
      },
      "message": "sync: Order projects according to last fetch time\n\nSome projects may consistently take longer to fetch than others, for\nexample a more active project may have many more Gerrit changes than a\nless active project, which take longer to transfer. Use a simple\nheuristic based on the last fetch time to fetch slower projects first,\nso we do not tend to spend the end of the sync fetching a small number\nof outliers.\n\nThis algorithm is probably not optimal, and due to inter-run latency\nvariance and Python thread scheduling, we may not even have good\nestimates of a project sync time.\n\nChange-Id: I9a463f214b3ed742e4d807c42925b62cb8b1745b\n"
    },
    {
      "commit": "a5be53f9c809009e67f217c00b8f30246aacc237",
      "tree": "7ab0da1fd31968eee882de81df8c9b93ae52fdfb",
      "parents": [
        "9ed12c5d9cda1f010bc173b0bc622d59e96b0dd0"
      ],
      "author": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Sun Sep 09 15:37:57 2012 -0700"
      },
      "committer": {
        "name": "Sarah Owens",
        "email": "sarato@inkylabs.com",
        "time": "Tue Oct 23 21:35:59 2012 -0700"
      },
      "message": "Use modern Python exception syntax\n\n\"except Exception as e\" instead of \"except Exception, e\"\n\nThis is part of a transition to supporting Python 3.  Python \u003e\u003d 2.6\nsupport \"as\" syntax.\n\nNote: this removes Python 2.5 support.\n\nChange-Id: I309599f3981bba2b46111c43102bee38ff132803\n"
    },
    {
      "commit": "69998b0c6ff724bf620480140ccce648fec7d6a9",
      "tree": "b6f9c4c00b04a0f140074c4c2dba91ed4f055b11",
      "parents": [
        "5c6eeac8f0350fd6b14cf226ffcff655f1dd9582"
      ],
      "author": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Wed Jan 11 11:28:42 2012 +0800"
      },
      "committer": {
        "name": "Che-Liang Chiou",
        "email": "clchiou@google.com",
        "time": "Tue Oct 23 16:08:58 2012 -0700"
      },
      "message": "Represent git-submodule as nested projects\n\nWe need a representation of git-submodule in repo; otherwise repo will\nnot sync submodules, and leave workspace in a broken state.  Of course\nthis will not be a problem if all projects are owned by the owner of the\nmanifest file, who may simply choose not to use git-submodule in all\nprojects.  However, this is not possible in practice because manifest\nfile owner is unlikely to own all upstream projects.\n\nAs git submodules are simply git repositories, it is natural to treat\nthem as plain repo projects that live inside a repo project.  That is,\nwe could use recursively declared projects to denote the is-submodule\nrelation of git repositories.\n\nThe behavior of repo remains the same to projects that do not have a\nsub-project within.  As for parent projects, repo fetches them and their\nsub-projects as normal projects, and then checks out subprojects at the\ncommit specified in parent\u0027s commit object.  The sub-project is fetched\nat a path relative to parent project\u0027s working directory; so the path\nspecified in manifest file should match that of .gitmodules file.\n\nIf a submodule is not registered in repo manifest, repo will derive its\nproperties from itself and its parent project, which might not always be\ncorrect.  In such cases, the subproject is called a derived subproject.\n\nTo a user, a sub-project is merely a git-submodule; so all tips of\nworking with a git-submodule apply here, too.  For example, you should\nnot run `repo sync` in a parent repository if its submodule is dirty.\n\nChange-Id: I541e9e2ac1a70304272dbe09724572aa1004eb5c\n"
    },
    {
      "commit": "2f6ab7f5b8f21b2dbfe9ae102674bd1694e94f03",
      "tree": "040f9045751d83902ea8c479304fdfa2a0061a54",
      "parents": [
        "3a6cd4200e42fbb5a21b3fb8d3c9738c0320cc63"
      ],
      "author": {
        "name": "Mickaël Salaün",
        "email": "mic@digikod.net",
        "time": "Sun Sep 30 00:37:55 2012 +0200"
      },
      "committer": {
        "name": "Mickaël Salaün",
        "email": "mic@digikod.net",
        "time": "Wed Oct 10 08:30:15 2012 +0200"
      },
      "message": "Rename \"dir\" variables\n\nThe variable name \"dir\" conflicts with the name of a Python built-in\nfunction: http://docs.python.org/library/functions.html#dir\n\nChange-Id: I850f3ec8df7563dc85e21f2876fe5e6550ca2d8f\n"
    },
    {
      "commit": "8a68ff96057ec58e524a3e41a2d8dca7b5d016bc",
      "tree": "22f6971e8d3c4a90d11d3704602d073a852328b4",
      "parents": [
        "e3b1c45aebed329cbc9ad172b1d8e812cf208117"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Mon Sep 24 12:15:13 2012 +0900"
      },
      "committer": {
        "name": "Gustaf Lundh",
        "email": "gustaf.lundh@sonymobile.com",
        "time": "Tue Oct 09 12:45:30 2012 +0200"
      },
      "message": "Coding style cleanup\n\nFix the following issues reported by pylint:\n\nC0321: More than one statement on a single line\nW0622: Redefining built-in \u0027name\u0027\nW0612: Unused variable \u0027name\u0027\nW0613: Unused argument \u0027name\u0027\nW0102: Dangerous default value \u0027value\u0027 as argument\nW0105: String statement has no effect\n\nAlso fixed a few cases of inconsistent indentation.\n\nChange-Id: Ie0db839e7c57d576cff12d8c055fe87030d00744\n"
    },
    {
      "commit": "e3b1c45aebed329cbc9ad172b1d8e812cf208117",
      "tree": "629984135b1cea3c0a32454eaecbe806ed09ca58",
      "parents": [
        "7119f94abaa48b3b7fb990f2a12ec5458ef3f133"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Oct 03 18:04:02 2012 +0900"
      },
      "committer": {
        "name": "Gustaf Lundh",
        "email": "gustaf.lundh@sonymobile.com",
        "time": "Fri Oct 05 10:34:19 2012 +0200"
      },
      "message": "Remove unreachable code\n\nChange 9bb1816b removed part of a block of code, but left the\nremaining part unreachable.  Remove it.\n\nChange-Id: Icdc6061d00e6027df32dee9a3bad3999fe7cdcbc\n"
    },
    {
      "commit": "cf76b1bcec6386f9530636e64746502f9856b5cf",
      "tree": "15bd204cace8d3d43161f8ef91130984159e9049",
      "parents": [
        "e00aa6b923d28a3c910f85e7726e4ba1d2a9aebd"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Fri Sep 14 10:31:42 2012 +0900"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Sep 21 11:20:59 2012 -0700"
      },
      "message": "sync: Support manual authentication to the manifest server\n\nAdd two new command line options, -u/--manifest-server-username and\n-p/--manifest-server-password, which can be used to specify a username\nand password to authenticate to the manifest server when using the\n-s/--smart-sync or -t/--smart-tag option.\n\nIf -u and -p are not specified when using the -s or -t option, use\nauthentication credentials from the .netrc file (if there are any).\n\nAuthentication credentials from -u/-p or .netrc are not used if the\nmanifest server specified in the manifest file already includes\ncredentials.\n\nChange-Id: I6cf9540d28f6cef64c5694e8928cfe367a71d28d\n"
    },
    {
      "commit": "86d973d24ec6771504c37eddc535dff8e03c724f",
      "tree": "1676f107c59efd1d92bd92cb48a9dc726bf00e59",
      "parents": [
        "34acdd253439448b6c08c3abfc5e7b8bd03f383f"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Fri Aug 24 10:21:02 2012 +0900"
      },
      "committer": {
        "name": "Gustaf Lundh",
        "email": "gustaf.lundh@sonymobile.com",
        "time": "Tue Sep 11 09:45:48 2012 +0200"
      },
      "message": "sync: Support authentication to manifest server with .netrc\n\nWhen using the --smart-sync or --smart-tag option, and the specified\nmanifest server is hosted on a server that requires authentication,\nrepo sync fails with the error: HTTP 401 Unauthorized.\n\nAdd support for getting the credentials from the .netrc file.\n\nIf a .netrc file exists in the user\u0027s home directory, and it contains\ncredentials for the hostname of the manifest server specified in the\nmanifest, use the credentials to authenticate with the manifest server\nusing the URL syntax extension for Basic Authentication:\n\n  http://user:password@host:port/path\n\nCredentials from the .netrc file are only used if the manifest server\nURL specified in the manifest does not already include credentials.\n\nChange-Id: I06e6586e8849d0cd12fa9746789e8d45d5b1f848\n"
    },
    {
      "commit": "d94aaef39e301cc912968c07d1783232bf34a174",
      "tree": "48b884fef63992e8b80127c40687a7cf5ff4c8f7",
      "parents": [
        "bd489c4eaa592af98b8b4f09b0a465e0d2b6046a"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Fri Sep 07 09:52:04 2012 +0900"
      },
      "committer": {
        "name": "Gustaf Lundh",
        "email": "gustaf.lundh@sonymobile.com",
        "time": "Fri Sep 07 10:17:00 2012 +0200"
      },
      "message": "sync: Correct imports of `R_HEADS` and `HEAD`\n\n`R_HEADS` is imported twice, from both the git_refs and project\nmodules.\n\nIt is actually defined in git_refs, and in project it is imported\nfrom there, so the import of `R_HEADS` from project in the sync\nmodule is redundant.  Remove it.\n\n`HEAD` is imported from project, but like `R_HEADS` it is actually\ndefined in git_refs.  Import it from git_refs instead.\n\nChange-Id: I8e2b0217d0d9f9f4ee5ef5b8cd0b026174ac52f4\n"
    },
    {
      "commit": "bd489c4eaa592af98b8b4f09b0a465e0d2b6046a",
      "tree": "6954a16b023daaea026d122251157c0b2db39367",
      "parents": [
        "2dc810c2e4028878b9c3484866a5973d5c33479d"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Aug 23 10:21:26 2012 +0900"
      },
      "committer": {
        "name": "gerrit code review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Sep 06 11:18:25 2012 -0700"
      },
      "message": "sync: catch exceptions when connecting to the manifest server\n\nWhen connecting to the manifest server, exceptions can occur but\nare not caught, resulting in the repo sync exiting with a python\ntraceback.\n\nAdd handling of the following exceptions:\n\n- IOError, which can be raised for example if the manifest server\nURL is malformed.\n- xmlrpclib.ProtocolError, which can be raised if the connection\nto the manifest server fails with HTTP error.\n- xmlrpclib.Fault, which can be raised if the RPC call fails for\nsome other reason.\n\nChange-Id: I3a4830aef0941debadd515aac776a3932e28a943\n"
    },
    {
      "commit": "e2126652a3a1e08724a54091793bb29a79d31014",
      "tree": "a931f598a6a2dcd7bc449ca7167799a18b0b493d",
      "parents": [
        "9a27d0111d5cf88c6b9409261707a5d7d50aaa64"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Sep 05 10:35:06 2012 +0200"
      },
      "committer": {
        "name": "gerrit code review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Sep 05 11:38:41 2012 -0700"
      },
      "message": "Make \"repo sync -j\u003ccount\u003e\" stop properly on Ctrl-C.\n\nThe threaded \u0027repo sync\u0027 implementation would very often freeze the\nprocess when interrupted by the user with Ctrl-C. The only solution\nbeing to kill -9 the process explicitly from another terminal.\n\nThe reason for this is best explained here:\n\nhttp://snakesthatbite.blogspot.fr/2010/09/cpython-threading-interrupting.html\n\nThis patch makes all helper sync threads \u0027daemon\u0027, which allows the\nprocess to terminate immediately on Ctrl-C.\n\nNote that this will forcefully kill all threads in case of interruption; this\nis generally a bad thing, but:\n\n  1/ This is equivalent to calling kill -9 in another terminal, which\n     is the _only_ thing that can currently stop the process.\n\n  2/ There doesn\u0027t seem to be a way to tell the worker threads to\n     gently stop when they are in a blocking operation anyway (even\n     in the non-threaded case).\n\n+ Do the same for \"repo status -j\u003ccount\u003e\".\n\nChange-Id: Ieaf45b0eacee36f35427f8edafd87415c2aa7be4\n"
    },
    {
      "commit": "5d0efdb14a31d651a0f6061ffb73452a20b7ed77",
      "tree": "a7c781f860bb675d88cfcc8708a28894aa761229",
      "parents": [
        "f35b2d9c31f62a488a0d470f269c85cda5b02d72"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Aug 02 12:13:01 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Aug 02 12:13:01 2012 -0700"
      },
      "message": "sync: Honor --no-clone-bundle with -j1\n\nChange-Id: I7c12902e386121a374d525be673092360c67c53d\n"
    },
    {
      "commit": "5acde75e5d70b323197ffb2c9d4fdea3612098f5",
      "tree": "e995a64614ce7406633ae6e99c2a0e6f86872e09",
      "parents": [
        "d67872d2f47b2f09a0e2aa4adfd62e6f69154c9b"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Mar 28 20:15:45 2012 -0700"
      },
      "committer": {
        "name": "Shawn Pearce",
        "email": "sop@google.com",
        "time": "Fri Apr 13 09:46:00 2012 -0700"
      },
      "message": "Add manifest groups\n\nAllows specifying a list of groups with a -g argument to repo init.\nThe groups act on a group\u003d attribute specified on projects in the\nmanifest.\nAll projects are implicitly labelled with \"default\" unless they are\nexplicitly labelled \"-default\".\nPrefixing a group with \"-\" removes matching projects from the list\nof projects to sync.\nIf any non-inverted manifest groups are specified, the default label\nis ignored.\n\nChange-Id: I3a0dd7a93a8a1756205de1d03eee8c00906af0e5\nReviewed-on: https://gerrit-review.googlesource.com/34570\nReviewed-by: Shawn Pearce \u003csop@google.com\u003e\nTested-by: Shawn Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "e02ac0af2e69f2c149de942d639bf305e5ae391a",
      "tree": "47da1f6f01e8429659ca10de890c9747c2a0e80a",
      "parents": [
        "898e12a2d9340706eca79e6c611166dfe35a1d3e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 14 15:36:59 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 14 15:38:28 2012 -0700"
      },
      "message": "sync: --no-clone-bundle disables the clone bundle support\n\nChange-Id: Ia9ed7da8451b273c1be620c3dd0dcad777b29096\n"
    },
    {
      "commit": "e9dc3b33680571731181f30fbd38317d19c24652",
      "tree": "3f714ed282c94d2d055a2b5c050f4cf840f933bc",
      "parents": [
        "c9571423f843340de19ef576ccaa418ac72fdb58"
      ],
      "author": {
        "name": "Chris Wolfe",
        "email": "cwolfe@chromium.org",
        "time": "Thu Jan 26 11:36:18 2012 -0500"
      },
      "committer": {
        "name": "Chris Wolfe",
        "email": "cwolfe@chromium.org",
        "time": "Thu Jan 26 12:32:36 2012 -0500"
      },
      "message": "sync: Add manifest_name parameter\n\nThis parameter changes the manifest used by \u0027repo sync\u0027 for only\nthis execution. It should be useful for developers wishing to get\nthe repo temporarily into a known state, without clobbering their\nexisting manifest.\n\nTested by shifting Chrome OS between minilayout and full, and\nbetween several release-builder-generated manifests.\n\nChange-Id: I14194b665195b0e78f368d9ec8b8a83227af2627\n"
    },
    {
      "commit": "53d6f4d17e0cb4eabcd604d584a1132a51cc8bf3",
      "tree": "c9effdc3a5d890ac55fb8a9f2aa68ac0d500873e",
      "parents": [
        "9d8f914fe8ac75e18e0da2b7ce4886a2ba490fc6"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Thu Aug 25 17:21:47 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 03 13:08:27 2011 -0700"
      },
      "message": "Add a sync flag that fetches only current branch\n\nThere is also shortcuts in case if the \"current branch\" is\na persistent revision such as tag or sha1. We check if the\npersistent revision is present locally and if it does - do\nno fetch anything from the server.\n\nThis greately reduces sync time and size of the on-disk repo\n\nChange-Id: I23c6d95185474ed6e1a03c836a47f489953b99be\n"
    },
    {
      "commit": "df5ee52050a5b8ea4e0bb69c007dac556c18ec03",
      "tree": "760f85dcd1039e3ba6110d39cc041c664730e7cb",
      "parents": [
        "fab96c68e3acfb5403ffe65577563f3cb39e2530"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 14:05:21 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Oct 11 14:06:11 2011 -0700"
      },
      "message": "Fix Python 2.4 support\n\nChange-Id: I89521ae52fa564f0d849cc51e71fee65b3c47bab\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c4657969ebd3ec6bf28a37b6a53360314a01be73",
      "tree": "ada21c1775c4a8d96f30105f4d8c3480ca22fdb4",
      "parents": [
        "7b947de1ee015ab4d981d34566becba8222931ec"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 26 09:08:01 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 26 09:08:44 2011 -0700"
      },
      "message": "sync: Update default -j flag from manifest\n\nIf the manifest is updated and the default sync-j attribute\nwas modified, honor it during this sync session if the user\nhas not supplied a -j flag on the command line.\n\nChange-Id: I127ee5c779e2bbbb40b30bddc10ec1fa704b3bf3\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "6392c879454bd4fa0e770195ee8424e383d17df2",
      "tree": "bfbfedb0a1d7f3fbe648deaf09e570ba347feeb0",
      "parents": [
        "97d2b2f7a087bfc695536ae9be962406d82152f2"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 17:44:31 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 18:08:27 2011 -0700"
      },
      "message": "sync: Allow -j to have a default in manifest\n\nThis permits manifest authors to suggest a number of parallel\nfetch operations against a remote server. For example, Gerrit\nCode Review servers support queuing of requests and processes\nthem in first-in, first-out order. Running concurrent fetches\ncan utilize multiple CPUs on the Gerrit server, but will also\ndecrease overall operation latency by having the request put\ninto the queue ready to execute as soon as a CPU is free.\n\nChange-Id: I3d3904acb6f63516bae4b071c510ad57a2afab18\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "97d2b2f7a087bfc695536ae9be962406d82152f2",
      "tree": "7cf3c07c6c9f42f17e1ade91eb354f95a16a0a80",
      "parents": [
        "3a0e782790ab83e3b1e93fe2fd57f7197ace2f76"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 17:23:41 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Sep 22 18:08:26 2011 -0700"
      },
      "message": "sync: Limit -j to file descriptors\n\nEach worker thread requires at least 3 file descriptors to run the\nforked \u0027git fetch\u0027 child to operate against the local repository.\nMac OS X has the RLIMIT_NOFILE set to 256 by default, which means\na sync -j128 often fails when the workers run out of pipes within\nthe Python parent process.\n\nChange-Id: I2cdb14621b899424b079daf7969bc8c16b85b903\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "08c880db1882743900ce1ed82b5026566b64d1f5",
      "tree": "f4b225c3aea7bb2808d995695e884d7b265bfeea",
      "parents": [
        "a101f1c1670c9992c28980a7028dc6c60028af69"
      ],
      "author": {
        "name": "Victor Boivie",
        "email": "victor.boivie@sonyericsson.com",
        "time": "Tue Apr 19 10:32:52 2011 +0200"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jul 20 07:13:48 2011 -0700"
      },
      "message": "Smart tag support\n\nThis is an evolution of \u0027smart-sync\u0027 that adds a new option, -t,\nthat allows you to specify a tag/label to use instead of the\n\"latest good build\" on the current manifest branch which -s does.\n\nSigned-off-by: Victor Boivie \u003cvictor.boivie@sonyericsson.com\u003e\nChange-Id: I8c20fd91104a6aafa0271d4d33f6c4850aade17e\n"
    },
    {
      "commit": "723c5dc3d62fe07ba4faa17434870917ae87ce9d",
      "tree": "3ed0ea8b803d8dab2ae30ae6832d154be85108fb",
      "parents": [
        "e6a0eeb80d46a5e5e99ce17a46f93e83ee2782cc"
      ],
      "author": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Mon Apr 04 11:15:17 2011 -0400"
      },
      "committer": {
        "name": "Daniel Sandler",
        "email": "dsandler@android.com",
        "time": "Mon Apr 04 11:34:47 2011 -0400"
      },
      "message": "Fix parallel sync on python \u003c 2.6.\n\nEvent.isSet was renamed to is_set in 2.6, but we should\nuse the earlier syntax to avoid breaking compatibility\nwith older Python installations.\n\nChange-Id: I41888ed38df278191d7496c1a6eed15e881733f4\n"
    },
    {
      "commit": "e6a0eeb80d46a5e5e99ce17a46f93e83ee2782cc",
      "tree": "b9bb6905b377274f44331cf74c1bf29e50799ceb",
      "parents": [
        "0960b5b53df6df7169c295de5509b0f705352d3b"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 22 19:04:47 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 22 19:04:47 2011 -0700"
      },
      "message": "sync: Fix syntax error on Python 2.4\n\nChange-Id: I371d032d5a1ddde137721cbe2b24bfa38f20aaaa\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "fc06ced9f9b8b00841991b92a2a661302a69eb7b",
      "tree": "2bcb74073cb50022af2d6639a5bcd8c6a86f436f",
      "parents": [
        "fce89f218a57e651e18cb91f5154e226c3f152b5"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Wed Mar 16 15:49:18 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Mar 17 09:17:42 2011 -0700"
      },
      "message": "Make \u0027repo sync -jN\u0027 exit with an error code in the case of sync errors.\n\nThe bug that this is fixing is described here:\n\nhttp://code.google.com/p/chromium-os/issues/detail?id\u003d6813\n\nThis fix allows the helper threads to signal the main thread that they\nsaw an error.  When the main thread sees the error, it will let all\nexisting threads finish, then exit with an error.\n\nChange-Id: If3019bc6b0b3ab9304d49ed2eea53e9d57f3095a\n"
    },
    {
      "commit": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "c95583bf4f17b8467f815b6391ffc6c7add08804",
      "tree": "c69bf8a061279b79326fb00f2197efcd8726864c",
      "parents": [
        "6a5644d392069b67f17c8ce6cb10f07cce71cc1c"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:47:06 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Mar 03 17:47:06 2009 -0800"
      },
      "message": "Don\u0027t permit users to run repo status in a mirror client\n\nIf a client was created with \"repo init --mirror\" then there are\nno working directories present, and no files checked out.  Using\na command like \"repo status\" in this context makes no sense, and\nactually throws back a Pytyon traceback at the console when the\nunderlying commands fail out.\n\nWe now tag commands with the MirrorSafeCommand type if they are\nable to be executed within a mirror directory safely.  Using a\ncommand in a mirror which lacks this base class results in a\nuseful error letting you know the command isn\u0027t supported.\n\nBug: REPO-14\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "e284ad1d1a2c6fa0e0ac800e87b2607f9bda339e",
      "tree": "fcf35ac784ec2e13c78ee3882ccb1fec0ad3d049",
      "parents": [
        "3e5481999d5f853e19ee5caaaaa968fc4b5176ab"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 07:37:10 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Nov 05 18:08:32 2008 -0800"
      },
      "message": "Add \u0027repo init --mirror\u0027 to download a complete forrest\n\nThe mirror option downloads a complete forrest (as described by the\nmanifest) and creates a replica of the remote repositories rather\nthan a client working directory.  This permits other clients to\nsync off the mirror site.\n\nA mirror can be positioned in a \"DMZ\", where the mirror executes\n\"repo sync\" to obtain changes from the external upstream and\nclients inside the protected zone operate off the mirror only,\nand therefore do not require direct git:// access to the external\nupstream repositories.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "c9ef744c7b5f6bcab446cf0a0bc9cc1b016dd5f8",
      "tree": "ff1bd7309698ef0dd312daf205512b1fa96d3e8d",
      "parents": [
        "438ee1cad98ac32509718976e63c36a449bfb679"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 03 10:32:09 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Nov 03 11:00:44 2008 -0800"
      },
      "message": "Install a default pre-auto-gc hook in all repositories\n\nThis hook is evaluated by `git gc --auto` to determine if it is a\ngood idea to execute a GC at this time, or defer it to some later\ndate.  When working on a laptop its a good idea to avoid GC if you\nare on battery power as the extra CPU and disk IO would consume a\ndecent amount of the charge.\n\nThe hook is the standard sample hook from git.git contrib/hooks,\nlast modified in git.git by 84ed4c5d117d72f02cc918e413b9861a9d2846d7.\nI added the GPLv2 header to the script to ensure the license notice\nis clear, as it does not match repo\u0027s own APLv2 license.\n\nWe only update hooks during initial repository creation or on\na repo sync.  This way we don\u0027t incur huge overheads from the\nhook stat operations during \"repo status\" or even the normal\n\"repo sync\" cases.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "cf31fe9b4fb650b27e19f5d7ee7297e383660caf",
      "tree": "d04ca6a45d579dca5e5469606c48c405aee68f4b",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
