)]}'
{
  "log": [
    {
      "commit": "75ee0570da09abb1d2bbefe0d25f0560727e6b71",
      "tree": "c62ab4990212282d9c18c694ec21830ad33481f2",
      "parents": [
        "88b86728a4451b97a2c6dcae2feb98014c077793"
      ],
      "author": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Nov 15 17:33:11 2012 -0800"
      },
      "committer": {
        "name": "Conley Owens",
        "email": "cco3@android.com",
        "time": "Thu Nov 15 18:50:11 2012 -0800"
      },
      "message": "Raise a NoManifestException when the manifest DNE\n\nWhen a command (eg, `repo forall`) expects the manifest project to\nexist, but there is no manifest, an IOException gets raised.  This\nchange defines a new Exception type to be raised in these cases and\nraises it when project.py fails to read the manifest.\n\nChange-Id: Iac576c293a37f7d8f60cd4f6aa95b2c97f9e7957\n"
    },
    {
      "commit": "5c6eeac8f0350fd6b14cf226ffcff655f1dd9582",
      "tree": "3225695b9d2a97342a49127717ea5e2bc5935a63",
      "parents": [
        "e98607248eec2b149d84efe944c12cbef419b82e"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Thu Oct 11 16:44:48 2012 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Mon Oct 22 12:30:14 2012 +0900"
      },
      "message": "More coding style cleanup\n\nFixing more issues found with pylint.  Some that were supposed to\nhave been fixed in the previous sweep (Ie0db839e) but were missed:\n\nC0321: More than one statement on a single line\nW0622: Redefining built-in \u0027name\u0027\n\nAnd some more:\n\nW0631: Using possibly undefined loop variable \u0027name\u0027\nW0223: Method \u0027name\u0027 is abstract in class \u0027name\u0027 but is not overridden\nW0231: __init__ method from base class \u0027name\u0027 is not called\n\nChange-Id: Ie119183708609d6279e973057a385fde864230c3\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": "b926116a1483d04df99252ed02418bf8e58094a3",
      "tree": "67bbae4a818085b42de7a6a3ee41aaa5fdade55c",
      "parents": [
        "3ff9decfd4e2f1fed71658d0f78a17895f80ff5f"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "david.pursehouse@sonymobile.com",
        "time": "Wed Oct 03 15:47:02 2012 +0900"
      },
      "committer": {
        "name": "Gustaf Lundh",
        "email": "gustaf.lundh@sonymobile.com",
        "time": "Thu Oct 04 10:31:09 2012 +0200"
      },
      "message": "Remove `ImportError` class\n\nThe definition of `ImportError` redefines the Python built-in\nclass of the same name.\n\nIt is not used anywhere, so remove it.\n\nChange-Id: I557ce28c93a3306fff72873dc6f477330fc33128\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": "f322b9abb4cadc67b991baf6ba1b9f2fbd5d7812",
      "tree": "ce75a04fed2e84457800325d158de13645cef67e",
      "parents": [
        "db728cd866d4950779620993e12e76f09eb6e2ee"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Sep 19 14:50:58 2011 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Sep 28 10:07:36 2011 -0700"
      },
      "message": "sync: Support downloading bundle to initialize repository\n\nAn HTTP (or HTTPS) based remote server may now offer a \u0027clone.bundle\u0027\nfile in each repository\u0027s Git directory. Over an http:// or https://\nremote repo will first ask for \u0027$URL/clone.bundle\u0027, and if present\ndownload this to bootstrap the local client, rather than relying\non the native Git transport to initialize the new repository.\n\nBundles may be hosted elsewhere. The client automatically follows a\nHTTP 302 redirect to acquire the bundle file. This allows servers\nto direct clients to cached copies residing on content delivery\nnetworks, where the bundle may be closer to the end-user.\n\nBundle downloads are resumeable from where they last left off,\nallowing clients to initialize large repositories even when the\nconnection gets interrupted.\n\nIf a bundle does not exist for a repository (a HTTP 404 response\ncode is returned for \u0027$URL/clone.bundle\u0027), the native Git transport\nis used instead. If the client is performing a shallow sync, the\nbundle transport is not used, as there is no way to embed shallow\ndata into the bundle.\n\nChange-Id: I05dad17792fd6fd20635a0f71589566e557cc743\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": "54fccd71fbdc60adf99b9a9bf4712c121d4312ba",
      "tree": "d51eb84344c0433e12335b1000ce3526b1368cf8",
      "parents": [
        "fb5c8fd948dea211cd8f43477855de44c273a1bf"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 24 07:09:51 2009 -0700"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Wed Jun 24 07:15:21 2009 -0700"
      },
      "message": "Document any crashes from the user\u0027s text editor\n\nRather than failing with no information, display the child exit\nstatus and the command line we tried to use to edit a text file.\nThere may be some useful information to help understand the crash.\n\nSigned-off-by: Shawn O. Pearce \u003csop@google.com\u003e\n"
    },
    {
      "commit": "559b846b17a5b720c1247d07e292150466f27f96",
      "tree": "1b0c5ed818859db0ef13b943dc005af4fbdd3289",
      "parents": [
        "7c6c64d463d3baa361ef7bef8ff3149134819c96"
      ],
      "author": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 12:56:08 2009 -0800"
      },
      "committer": {
        "name": "Shawn O. Pearce",
        "email": "sop@google.com",
        "time": "Mon Mar 02 12:56:08 2009 -0800"
      },
      "message": "Report better errors when a project revision is invalid\n\nIf a manifest specifies an invalid revision property, give the\nuser a better error message detaling the problem, instead of an\nugly Python traceback with a strange Git error message.\n\nBug: REPO-2\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"
    }
  ]
}
