)]}'
{
  "log": [
    {
      "commit": "7a91d51dcfc9516abc38aeaf5462ac55d454bb43",
      "tree": "484ea52178b2a6185916dafe9a7ddce304bb8783",
      "parents": [
        "a8d539189e1c788663f022cbebd3b5ff28aaeb4b"
      ],
      "author": {
        "name": "Mani Chandel",
        "email": "mani.chandel@tcs.com",
        "time": "Thu Jul 24 16:27:08 2014 +0530"
      },
      "committer": {
        "name": "Mani Chandel",
        "email": "mani.chandel@tcs.com",
        "time": "Thu Jul 24 16:27:08 2014 +0530"
      },
      "message": "Enable transferring of attribute using command \u0027repo manifest -o -\u0027\n\n\u0027upstream\u0027 attribute is now transferred to the new manifest xml\nthat is created when using command \u0027repo manifest -o -\u0027.\n\nManifest help is updated for the attributes \u0027sync-c\u0027,\u0027sync-s\u0027 and\n\u0027sync-j\u0027.\n\nBug: Issue 164\nChange-Id: If63f781e91d25c5b5b5ea0696b0c04337b0a686a\n"
    },
    {
      "commit": "36ea2fb6ee0f42144d44cf9aa7196bfa3b56e9e6",
      "tree": "34fc7410de43113f50cf9bdd36c5f8144316eca0",
      "parents": [
        "666d534636d262cbfd971509dd0f0be0cddb2e11"
      ],
      "author": {
        "name": "Anthony King",
        "email": "anthonydking@slimroms.net",
        "time": "Tue May 06 11:54:01 2014 +0100"
      },
      "committer": {
        "name": "Anthony King",
        "email": "anthonydking@slimroms.net",
        "time": "Wed May 07 08:29:30 2014 +0000"
      },
      "message": "Enable remotes to define their own revision\n\nSome projects use multiple remotes.\nIn some cases these remotes have different naming conventions.\nAdd an option to define a revision in the remote configuration.\n\nThe `project` revision takes precedence over `remote` and `default`.\nThe `remote` revision takes precedence over `default`.\nThe `default` revision acts as a fall back as it originally did.\n\nChange-Id: I2b376160d45d48b0bab840c02a3eef1a1e32cf6d\n"
    },
    {
      "commit": "53d6a7b8955e9377cc0a12206be357e7936621b1",
      "tree": "1a7728eff318e82dd3dd3f06c6d927712fc789e5",
      "parents": [
        "61df418c599a0359b33b8a65a12660023fc37a2a"
      ],
      "author": {
        "name": "Warren Turkal",
        "email": "wt@ooyala.com",
        "time": "Tue Dec 10 15:30:03 2013 -0800"
      },
      "committer": {
        "name": "Warren Turkal",
        "email": "wt@ooyala.com",
        "time": "Tue Dec 10 15:30:03 2013 -0800"
      },
      "message": "Fix error in xml manifest doc.\n\nThe docs on the annotations say that zero or more may exist as a child\nof a project, so that means that a \"*\" instead of a \"?\" should be used.\n\nChange-Id: Iff855d003dfb05cd980f285a237332914e1dad70\n"
    },
    {
      "commit": "d5a5b19efd2291914bcb861d527ae74e620a9d37",
      "tree": "9a1f10516792d6973449cab97f1f28ccfd655e7a",
      "parents": [
        "0eb35cbe5096128e4a760aca6842ecdbea5baf1a"
      ],
      "author": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Thu Nov 21 19:15:30 2013 +0530"
      },
      "committer": {
        "name": "Chirayu Desai",
        "email": "cdesai@cyanogenmod.org",
        "time": "Thu Nov 21 19:16:08 2013 +0530"
      },
      "message": "Remove trailing whitespace\n\nChange-Id: I56bcb559431277d40070fa33c580c6c3525ff9bc\n"
    },
    {
      "commit": "f609f91b72c0b90026da0eefcc0f52f12840971b",
      "tree": "819e244e52279d7b232df5e17727a9a828ddda66",
      "parents": [
        "59bbb580e34bbc5dce76dacaad9ff94f21fa396f"
      ],
      "author": {
        "name": "Bryan Jacobs",
        "email": "bryanrj@gmail.com",
        "time": "Mon May 06 13:36:24 2013 -0400"
      },
      "committer": {
        "name": "Bryan Jacobs",
        "email": "bryanrj@gmail.com",
        "time": "Fri May 24 12:17:22 2013 -0400"
      },
      "message": "Send reviews to a different branch from fetch\n\nThis adds the ability to have reviews pushed to a different branch\nfrom the one on which changes are based. This is useful for \"gateway\"\nsystems without smartsync.\n\nChange-Id: I3a8a0fabcaf6055e62d3fb55f89c944e2f81569f\n"
    },
    {
      "commit": "db83b1b5abcc2df1b5c7a76ca74ff60e88fe956e",
      "tree": "43f388a8dfd84a8e7b38c9e5787ae60e3dc84265",
      "parents": [
        "ede7f12d4a0f7362aaccd2c825a83765b9b9d968"
      ],
      "author": {
        "name": "Scott Fan",
        "email": "fancp2007@gmail.com",
        "time": "Thu Feb 28 09:34:14 2013 +0800"
      },
      "committer": {
        "name": "Scott Fan",
        "email": "fancp2007@gmail.com",
        "time": "Thu Apr 11 08:59:09 2013 +0800"
      },
      "message": "Allow mirror to be created in directories specified by \u0027path\u0027 attribute\n\nIn some cases, especially when local manifest files exist, users may want\nto force the mirrored repositories to be created in folders according to\ntheir \u0027path\u0027 attribute in the manifest, rather than according to the name\nof the repositories.\n\nTo enable this functionality for specified mirror, add a new attribute\n\u0027force-path\u0027 for that project in the manifest, set its value to \u0027true\u0027.\n\nChange-Id: I61df8c987a23d84309b113e7d886ec90c838a6cc\nSigned-off-by: Scott Fan \u003cfancp2007@gmail.com\u003e\n"
    },
    {
      "commit": "ede7f12d4a0f7362aaccd2c825a83765b9b9d968",
      "tree": "e2b1683926292028a8e32ce32419228517d60d56",
      "parents": [
        "04d84a23fd04c9e1dd15341eb7dd28a0d8ce99c6"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 27 22:25:30 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Apr 10 09:17:50 2013 +0900"
      },
      "message": "Allow clone depth to be specified per project\n\nIf the clone-depth attribute is set on a project, its value will\nbe used to set the depth when fetching the git.  The value, if\ngiven, must be a positive integer.\n\nThe value in the clone-depth attribute overrides any value given to\nrepo init via the --depth command line option.\n\nChange-Id: I273015b3724213600b63e40cca4cafaa9f782ddf\n"
    },
    {
      "commit": "4e46520362e4c75ae7809c74f3d1c21e86852ee8",
      "tree": "6a1aff062529de8af252c7ab2e0e8b2649f922ff",
      "parents": [
        "63d356ffce72f76936a17902fe2f4abcb43078bb"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 27 22:20:10 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Jan 29 10:09:21 2013 +0900"
      },
      "message": "Add missing manifest format documentation\n\nDocumentation of the \"sync-j\", \"sync-c\", \"sync-s\" and \"upstream\"\nattributes is missing/incomplete.  Add it.\n\nChange-Id: I74977f819f603c520ef3818f85c3b51399cd2b94\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": "9f3406ea4635e0f8cef1d0ec4dbfe6b1554375d6",
      "tree": "588758e23de5b24ffb3132aaf6ab35e6163da2d6",
      "parents": [
        "b1525bffae609455331d8587c14d22a5f58e203b"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 08:52:25 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 08:54:43 2012 +0900"
      },
      "message": "Minor documentation formatting and grammatical fixes\n\nChange-Id: Iaac6377c787b3bb42242780e9d1116e718e0188d\n"
    },
    {
      "commit": "b1525bffae609455331d8587c14d22a5f58e203b",
      "tree": "0ff74be8591170da14bbf8171144a72bc746b19c",
      "parents": [
        "685f080d626ccdc7ed0d76cccb38810285fc40e0"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 08:51:38 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 08:54:04 2012 +0900"
      },
      "message": "Fix documentation reference to local_manifest.xml\n\nDocumentation of the remove-project element still refers explicitly\nto local_manifest.xml.\n\nChange it to the more generic \"a local manifest\".\n\nChange-Id: I6278beab99a582fae26a4e053adc110362c714c2\n"
    },
    {
      "commit": "52f1e5d9111c586624de48b5f705e10b67d109b3",
      "tree": "64861a0d67e6194626a5fa8cd1c8d044bd353e1b",
      "parents": [
        "8e3d355d448671e7c9b3409a3bbde971f90d7c28"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 04:53:24 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Nov 14 05:05:32 2012 +0900"
      },
      "message": "Make load order of local manifests deterministic\n\nLocal manifest files stored in the local_manifests folder are loaded\nin alphabetical order, so it\u0027s easier to know in which order project\nremovals/additions/modifications will be applied.\n\nIf local_manifests.xml exists, it will be loaded before the files in\nlocal_manifests.\n\nChange-Id: Ia5c0349608f1823b4662cd6b340b99915bd973d5\n"
    },
    {
      "commit": "5566ae5ddea409279b13e538b513a73062862c3e",
      "tree": "8eee7a90ecf3692659eb2249c1a7b48c81de28a2",
      "parents": [
        "2d5a0df798b7b16ccf9c17b2435a9640cf0d81c0"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 13 03:04:18 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 13 08:19:51 2012 +0900"
      },
      "message": "Print deprecation warning when local_manifest.xml is used\n\nThe preferred way to specify local manifests is to drop the file(s)\nin the local_manifests folder.  Print a deprecation warning when\nthe legacy local_manifest.xml file is used.\n\nChange-Id: Ice85bd06fb612d6fcceeaa0755efd130556c4464\n"
    },
    {
      "commit": "2d5a0df798b7b16ccf9c17b2435a9640cf0d81c0",
      "tree": "ca99d70bdf9e4602beff0181f29f36a9d28eec7d",
      "parents": [
        "f7fc8a95beb1337e23f146cad8086c1fc05902ee"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 13 02:50:36 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Nov 13 08:19:51 2012 +0900"
      },
      "message": "Add support for multiple local manifests\n\nAdd support for multiple local manifests stored in the local_manifests\nfolder under the .repo home directory.\n\nLocal manifests will be processed in addition to local_manifest.xml.\n\nChange-Id: Ia0569cea7e9ae0fe3208a8ffef5d9679e14db03b\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": "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": "bb1b5f5f863fca0e85764f5b35c117f5724d15c0",
      "tree": "0b6b8d0d6d027f2d0e0dd6fabdd4eafc6c919026",
      "parents": [
        "e2126652a3a1e08724a54091793bb29a79d31014"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Aug 13 13:11:18 2012 -0700"
      },
      "committer": {
        "name": "gerrit code review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Sep 05 11:46:48 2012 -0700"
      },
      "message": "Allow projects to be specified as notdefault\n\nInstead of every group being in the group \"default\", every project\nis now in the group \"all\".   A group that should not be downloaded\nby default may be added to the group \"notdefault\".\n\nThis allows all group names to be positive (instead of removing groups\ndirectly in the manifest with -default) and offers a clear way of\nselecting every project (--groups all).\n\nChange-Id: I99cd70309adb1f8460db3bbc6eff46bdcd22256f\n"
    },
    {
      "commit": "9a27d0111d5cf88c6b9409261707a5d7d50aaa64",
      "tree": "4a80e3e4c1fd1367a120371375c8d3703edb4701",
      "parents": [
        "918ff85c1e9d9606e4924a0af9a8ddc2e4db692a"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Aug 21 14:23:49 2012 +0900"
      },
      "committer": {
        "name": "gerrit code review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Sep 05 06:00:47 2012 -0700"
      },
      "message": "manifest-format.txt: Add documentation for GetManifest RPC method\n\nAdd documentation of the GetManifest RPC method in the\nmanifest-server section.\n\nChange-Id: I5cda5929bc8a0ca9d3f2b9da63216427041d2823\n"
    },
    {
      "commit": "daa851f6cd9edb3851a3884fd2864f0f3dc583b2",
      "tree": "32479f87b1a60352934074b8999aa3ef975066a1",
      "parents": [
        "a43f42f9ffed69ee807852230e514b7c4bff5855"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Tue Aug 21 13:52:18 2012 +0900"
      },
      "committer": {
        "name": "gerrit code review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 22 09:39:41 2012 -0700"
      },
      "message": "manifest-format.txt: Fix a couple of minor spelling mistakes\n\nChange-Id: Ic2d266c8cf08827a71846db9d3711feb02885f01\n"
    },
    {
      "commit": "b292b98c3e9a9f666ca780ba60fdb4f306eca343",
      "tree": "75cea727be50c2e5b86d5c0fa62baae379315bf7",
      "parents": [
        "2f127de7520a0b689bfe5082360eeb53a05d6e2d"
      ],
      "author": {
        "name": "Yestin Sun",
        "email": "sunyi0804@gmail.com",
        "time": "Mon Jul 02 07:32:50 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Jul 31 22:13:13 2012 -0700"
      },
      "message": "Add remote alias support in manifest\n\nThe `alias` is an optional attribute in element `remote`. It can be\nused to override attibute `name` to be set as the remote name in each\nproject\u0027s .git/config. Its value can be duplicated while attribute\n`name` has to be unique across the manifest file. This helps each\nproject to be able to have same remote name which actually points\nto different remote url.\n\nIt eases some automation scripts to be able to checkout/push to same\nremote name but actually different remote url, like:\n\nrepo forall -c \"git checkout -b work same_remote/work\"\nrepo forall -c \"git push same_remote work:work\"\n\nfor example:\nThe manifest with \u0027alias\u0027 will look like:\n\n\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e\n\u003cmanifest\u003e\n  \u003cremote alias\u003d\"same_alias\" fetch\u003d\"git://git.external1.org/\" name\u003d\"ext1\"\n      review\u003d\"http://review.external1.org\"/\u003e\n  \u003cremote alias\u003d\"same_alias\" fetch\u003d\"git://git.external2.org/\" name\u003d\"ext2\"\n      review\u003d\"http://review.external2.org\"/\u003e\n  \u003cremote alias\u003d\"same_alias\" fetch\u003d\"ssh://git.internal.com:29418\" name\u003d\"int\"\n      review\u003d\"http://review.internal.com\"/\u003e\n  \u003cdefault remote\u003d\"int\" revision\u003d\"int-branch\" sync-j\u003d\"2\"/\u003e\n  \u003cproject name\u003d\"path/to/project1\" path\u003d\"project1\" remote\u003d\"ext1\"/\u003e\n  \u003cproject name\u003d\"path/to/project2\" path\u003d\"project2\" remote\u003d\"ext2\"/\u003e\n  \u003cproject name\u003d\"path/to/project3\" path\u003d\"project3\"/\u003e\n  ...\n\u003c/manifest\u003e\n\nIn each project, use command \"git remote -v\"\n\nproject1:\nsame_alias  git://git.external1.org/project1 (fetch)\nsame_alias  git://git.external1.org/project1 (push)\n\nproject2:\nsame_alias  git://git.external2.org/project2 (fetch)\nsame_alias  git://git.external2.org/project2 (push)\n\nproject3:\nsame_alias  ssh://git.internal.com:29418/project3 (fetch)\nsame_alias  ssh://git.internal.com:29418/project3 (push)\n\nChange-Id: I2c48263097ff107f0c978f3e83966ae71d06cb90\n"
    },
    {
      "commit": "7da1314e38a2bb2941511c9003fa388eddb55c0a",
      "tree": "21eb19cb1edb13fc0931fbef074d3dd36e5dc7ba",
      "parents": [
        "435370c6f0e202378ae233cf1088e499ba07e971"
      ],
      "author": {
        "name": "Brian Harring",
        "email": "ferringb@chromium.org",
        "time": "Fri Jun 15 02:24:20 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Jul 31 22:05:44 2012 -0700"
      },
      "message": "Inject the project name into each projects groups.\n\nFor CrOS, we have scenarios were people checkout a smaller version\nof our manifest via groups, and enable individual repositories as\nneeded for their work.  Previously this was via local_manifest\nmanipulation, which breaks via manifest-groups would require a\nremove-project tag.\n\nVia injecting the projects name into the projects groups, this\nallows us to instead manipulate the configured groups allowing\nthe user to turn on/off projects as necessary.\n\nChange-Id: I07b7918e16cc9dc28eb47e19a46a04dc4fd0be74\n"
    },
    {
      "commit": "2644874d9d3e6c16299a01acddf66cd99fd43414",
      "tree": "bd2e86186a48a22286c6e919758d7edf366bda9a",
      "parents": [
        "3d125940f6223efe62e35b795f57e7e717b4528e"
      ],
      "author": {
        "name": "Brian Harring",
        "email": "brian.harring@intel.com",
        "time": "Thu Apr 28 05:04:41 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu May 24 09:07:24 2012 -0700"
      },
      "message": "ManifestXml: add include support\n\nHaving the ability to include other manifests is a very practical feature\nto ease the managment of manifest. It allows to divide a manifest into separate\nfiles, and create different environment depending  on what we want to release\n\nYou can have unlimited recursion of include, the manifest configs will simply be concatenated\nas if it was in a single file.\n\ncommand \"repo manifest\" will create a single manifest, and not recreate the manifest hierarchy\n\nfor example:\nOur developement manifest will look like:\n\n\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e\n\u003cmanifest\u003e\n  \u003cdefault revision\u003d\"platform/android/main\" remote\u003d\"intel\"/\u003e\n  \u003cinclude name\u003d\"server.xml\"/\u003e \u003c!-- The Server configuration --\u003e\n  \u003cinclude name\u003d\"aosp.xml\" /\u003e  \u003c!-- All the AOSP projects --\u003e\n  \u003cinclude name\u003d\"bsp.xml\" /\u003e   \u003c!-- The BSP projects that we release in source form --\u003e\n  \u003cinclude name\u003d\"bsp-priv.xml\" /\u003e \u003c!-- The source of the BSP projects we release in binary form --\u003e\n\u003c/manifest\u003e\n\nOur release manifest will look like:\n\n\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e\n\u003cmanifest\u003e\n  \u003cdefault revision\u003d\"platform/android/release-ext\" remote\u003d\"intel\"/\u003e\n  \u003cinclude name\u003d\"server.xml\"/\u003e \u003c!-- The Server configuration --\u003e\n  \u003cinclude name\u003d\"aosp.xml\" /\u003e  \u003c!-- All the AOSP projects --\u003e\n  \u003cinclude name\u003d\"bsp.xml\" /\u003e   \u003c!-- The BSP projects that we release in source form --\u003e\n  \u003cinclude name\u003d\"bsp-ext.xml\" /\u003e \u003c!-- The PREBUILT version of the BSP projects we release in binary form --\u003e\n\u003c/manifest\u003e\n\nAnd it is also easy to create and maintain feature branch with a manifest that looks like:\n\n\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e\n\u003cmanifest\u003e\n  \u003cdefault revision\u003d\"feature_branch_foobar\" remote\u003d\"intel\"/\u003e\n  \u003cinclude name\u003d\"server.xml\"/\u003e \u003c!-- The Server configuration --\u003e\n  \u003cinclude name\u003d\"aosp.xml\" /\u003e  \u003c!-- All the AOSP projects --\u003e\n  \u003cinclude name\u003d\"bsp.xml\" /\u003e   \u003c!-- The BSP projects that we release in source form --\u003e\n  \u003cinclude name\u003d\"bsp-priv.xml\" /\u003e \u003c!-- The source of the BSP projects we release in binary form --\u003e\n\u003c/manifest\u003e\n\nSigned-off-by: Brian Harring \u003cbrian.harring@intel.com\u003e\nSigned-off-by: Pierre Tardy \u003cpierre.tardy@intel.com\u003e\nChange-Id: I833a30d303039e485888768e6b81561b7665e89d\n"
    },
    {
      "commit": "79770d269e319dee578beed682669703d4c764ba",
      "tree": "23e733be2bf80454de9352225366b92ef5cc9139",
      "parents": [
        "c39864f5e12fa4a6d3f2cdb4921afc021406d106"
      ],
      "author": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Fri Apr 20 14:41:59 2012 -0700"
      },
      "committer": {
        "name": "Anatol Pomazau",
        "email": "anatol@google.com",
        "time": "Mon Apr 23 14:10:52 2012 -0700"
      },
      "message": "Add sync-c option to manifest\n\nThere are use-cases when fetching all branch is impractical and\nwe really need to fetch only one branch/tag.\ne.g. there is a large project with binaries and every update of a\nbinary file is put to a separate branch.\nThe whole project history might be too large to allow users fetch it.\n\nAdd \u0027sync-c\u0027 option to \u0027project\u0027 and \u0027default\u0027 tags to make it possible\nto configure \u0027sync-c\u0027 behavior at per-project and per-manifest level.\n\nNote that currently there is no possibility to revert boolean flag from\ncommand line. If \u0027sync-c\u0027 is set in manifest then you cannot make\nfull fetch by providing a repo tool argument.\n\nChange-Id: Ie36fe5737304930493740370239403986590f593\n"
    },
    {
      "commit": "971de8ea7b7e474a4d9253b6c9f47da3f1130973",
      "tree": "d8ac52741957b38d57d15f208e57b984d71ddc19",
      "parents": [
        "24c130884018364f91baa8de0ff3541f4c32d1bb"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Mon Apr 16 10:36:08 2012 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 23 12:39:05 2012 -0700"
      },
      "message": "Refine groups functionality\n\nEvery project is in group \"default\".  \"-default\" does not remove\nit from this project.  All group names specified in the manifest\nare positive names as opposed to a mix of negative and positive.\n\nSpecified groups are resolved in order.  If init is supplied with\n--groups\u003d\"group1,-group2\", the following describes the project\nselection when syncing:\n\n  * all projects in \"group1\" will be added, and\n  * all projects in \"group2\" will be removed.\n\nChange-Id: I1df3dcdb64bbd4cd80d675f9b2d3becbf721f661\n"
    },
    {
      "commit": "24c130884018364f91baa8de0ff3541f4c32d1bb",
      "tree": "213b269d05e2a5f2b70d895325301a9a9f30e4a2",
      "parents": [
        "b962a1f5e0daad323bdd66fad93f00a3738cc255"
      ],
      "author": {
        "name": "James W. Mills",
        "email": "jameswmills@gmail.com",
        "time": "Thu Apr 12 15:04:13 2012 -0500"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Apr 23 12:35:08 2012 -0700"
      },
      "message": "Add project annotation handling to repo\n\nAllow the optional addition of \"annotation\" nodes nested under\nprojects.  Each annotation node must have \"name\" and \"value\"\nattributes.  These name/value pairs will be exported into the\nenvironment during any forall command, prefixed with \"REPO__\"\n\nIn addition, an optional \"keep\" attribute with case insensitive \"true\"\nor \"false\" values can be included to determine whether the annotation\nwill be exported with \u0027repo manifest\u0027\n\nChange-Id: Icd7540afaae02c958f769ce3d25661aa721a9de8\nSigned-off-by: James W. Mills \u003cjameswmills@gmail.com\u003e\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": "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": "37282b4b9c5b1d9a1ff07f7f0686a81b65a0a5c6",
      "tree": "aba568b85d38de4cfef90cd771169c9422aef09c",
      "parents": [
        "835cd6888f16ff30a3428adfa3a775efad918880"
      ],
      "author": {
        "name": "Doug Anderson",
        "email": "dianders@google.com",
        "time": "Fri Mar 04 11:54:18 2011 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Fri Mar 11 11:53:23 2011 -0800"
      },
      "message": "Support repo-level pre-upload hook and prep for future hooks.\n\nAll repo-level hooks are expected to live in a single project at the\ntop level of that project.  The name of the hooks project is provided\nin the manifest.xml.  The manifest also lists which hooks are enabled\nto make it obvious if a file somehow failed to sync down (or got\ndeleted).\n\nBefore running any hook, we will prompt the user to make sure that it\nis OK.  A user can deny running the hook, allow once, or allow\n\"forever\" (until hooks change).  This tries to keep with the git\nspirit of not automatically running anything on the user\u0027s computer\nthat got synced down.  Note that individual repo commands can add\nalways options to avoid these prompts as they see fit (see below for\nthe \u0027upload\u0027 options).\n\nWhen hooks are run, they are loaded into the current interpreter (the\none running repo) and their main() function is run.  This mechanism is\nused (instead of using subprocess) to make it easier to expand to a\nricher hook interface in the future.  During loading, the\ninterpreter\u0027s sys.path is updated to contain the directory containing\nthe hooks so that hooks can be split into multiple files.\n\nThe upload command has two options that control hook behavior:\n  - no-verify\u003dFalse, verify\u003dFalse (DEFAULT):\n    If stdout is a tty, can prompt about running upload hooks if needed.\n    If user denies running hooks, the upload is cancelled.  If stdout is\n    not a tty and we would need to prompt about upload hooks, upload is\n    cancelled.\n  - no-verify\u003dFalse, verify\u003dTrue:\n    Always run upload hooks with no prompt.\n  - no-verify\u003dTrue, verify\u003dFalse:\n    Never run upload hooks, but upload anyway (AKA bypass hooks).\n  - no-verify\u003dTrue, verify\u003dTrue:\n    Invalid\n\nSample bit of manifest.xml code for enabling hooks (assumes you have a\nproject named \u0027hooks\u0027 where hooks are stored):\n  \u003crepo-hooks in-project\u003d\"hooks\" enabled-list\u003d\"pre-upload\" /\u003e\n\nSample main() function in pre-upload.py in hooks directory:\n  def main(project_list, **kwargs):\n    print (\u0027These projects will be uploaded: %s\u0027 %\n           \u0027, \u0027.join(project_list))\n    print (\u0027I am being a good boy and ignoring anything in kwargs\\n\u0027\n           \u0027that I don\\\u0027t understand.\u0027)\n    print \u0027I fail 50% of the time.  How flaky.\u0027\n    if random.random() \u003c\u003d .5:\n      raise Exception(\u0027Pre-upload hook failed.  Have a nice day.\u0027)\n\nChange-Id: I5cefa2cd5865c72589263cf8e2f152a43c122f70\n"
    },
    {
      "commit": "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": "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": "242b52690d327a77e47140509085f406155c5722",
      "tree": "92b58b51e6f0b38bea6cc98a0c67604c5d08b7f1",
      "parents": [
        "4cc70ce501321733a1b389e685e964d34b3b4cf5"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:00:29 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue May 19 13:01:52 2009 -0700"
      },
      "message": "Remove support for the extra \u003cremote\u003e definitions in manifests\n\nThese aren\u0027t that widely used, and actually make it difficult for\nusers to fully mirror a forest of repositories, and then permit\nsomeone else to clone off that forest, rather then the original\nupstream servers.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "a490f03dc23792a86bbe5b2b8c89b32f39774c80",
      "tree": "60f1c904b47259643b40f0d7267a2136b3519c7a",
      "parents": [
        "deec0536d657be178e8eed2d597afb9fdc716e99"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:25:58 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Sat Apr 18 11:25:58 2009 -0700"
      },
      "message": "Correct note about local_manifest.xml capabilities\n\nWith the \u003cremove-project\u003e element we can remove projects, and\nfully replace them with a different definition.  So this note\nis out of date.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "43c3d9ea17f1436a6b3b2e7e7827da6f48a21da9",
      "tree": "9bfa77f57095fcd04901ee7783c78d49afdb1e9d",
      "parents": [
        "4259b8a2ac0dddb54e98e00afc454bf966d4f058"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:26:50 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Mar 04 14:26:50 2009 -0800"
      },
      "message": "Add a \u0027repo manifest\u0027 command whose help is the manifest file format\n\nThis should make it easier for users to discover the file format\non their own, and read about it.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "03eaf07ec6aa7e99a0444ac1ec708b2a5f7cbbf5",
      "tree": "3de33686218f59849912004a4376402082384fff",
      "parents": [
        "2896a79120fe1de65472736f756c47b558b44db1"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 20 11:42:22 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 20 11:54:46 2008 -0800"
      },
      "message": "Support \u003cremove-project name\u003d\"X\"\u003e in manifest to remove/replace X\n\nThe manifest files now permit removing a project so the user can\neither keep it out of their client, or replace it with a different\nproject using an entirely different configuration.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "70939e2f73bf118c89cf4af4988dba807c50a0ce",
      "tree": "b1849b9a48572876b35cd621192cbb4c712e816e",
      "parents": [
        "ae6e0949d187c35d79dbc0b21788fdbb2c65bf78"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 11:07:14 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 11:23:08 2008 -0800"
      },
      "message": "Add \u003cadd-remote to-project\u003d\"...\"\u003e to inject additional remotes\n\nThis way users can add forks they know about to an existing project\nthat was already declared in the primary manifest.  This is mostly\nuseful with the Linux kernel project, where multiple forks is quite\ncommon for the main upstream tree (e.g. Linus\u0027 tree), a platform\narchitecture tree (e.g. ARM) and a device specific tree (e.g. the\nmsm7k tree used by Android).\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "ae6e0949d187c35d79dbc0b21788fdbb2c65bf78",
      "tree": "7a825c0e8cb24f0df512f62f4e44970026641dda",
      "parents": [
        "339ba9f6f70b1733f89a5ff89d5f155389a04094"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 10:25:35 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 11:23:06 2008 -0800"
      },
      "message": "Add \u003cremote project-name\u003d\"...\"\u003e attribute within projects\n\nBy setting a project-name on a remote nested within a project forks\nof a project like the Linux kernel can be easily handled by fetching\nall relevant forks into the same client side project under different\nremote names.  Developers can create branches off different remotes\nusing `git checkout --track -b $myname $remote/$branch` and later\n`repo upload` automatically redirects to the proper fork project\nin the code review server.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "70cd4ab2708eaae7d96d7e8b0a3f88850c163543",
      "tree": "fe973a5bbed05d4fb81019a3c43f7660ff89bc2b",
      "parents": [
        "e284ad1d1a2c6fa0e0ac800e87b2607f9bda339e"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 08:48:44 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Thu Nov 06 08:48:44 2008 -0800"
      },
      "message": "Add some short documentation about the local manifest\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "3e5481999d5f853e19ee5caaaaa968fc4b5176ab",
      "tree": "fd6c97f1abd78525dc26b4eb2b8bc12027b7f93b",
      "parents": [
        "d3c388391e11aff0b26ecf19c8cb668a9629ef5a"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 11:19:36 2008 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Tue Nov 04 11:19:36 2008 -0800"
      },
      "message": "Add a basic outline of the repo manifest file format\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    }
  ]
}
