diff --git a/tools/checkout_aosp.py b/tools/checkout_aosp.py
index 36a5333..bef9413 100755
--- a/tools/checkout_aosp.py
+++ b/tools/checkout_aosp.py
@@ -14,56 +14,59 @@
 import utils
 import utils_aosp
 
-AOSP_MANIFEST_XML = join(utils.REPO_ROOT, 'third_party',
-  'aosp_manifest.xml')
+AOSP_MANIFEST_XML = join(utils.REPO_ROOT, 'third_party', 'aosp_manifest.xml')
 AOSP_MANIFEST_URL = 'https://android.googlesource.com/platform/manifest'
 J_DEFAULT = multiprocessing.cpu_count() - 2
 
+
 # Checkout AOSP source to the specified direcotry using the speficied manifest.
 def checkout_aosp(aosp_root, url, branch, manifest_xml, concurrency, shallow):
-  utils.makedirs_if_needed(aosp_root)
-  command = ['repo', 'init', '-u', url]
-  if (shallow):
-    command.extend(['--depth=1'])
-  if (branch):
-    command.extend(['-b', branch])
-  else:
-    manifests_dir = join(aosp_root, '.repo', 'manifests')
-    utils.makedirs_if_needed(manifests_dir)
-    copy2(manifest_xml, manifests_dir)
-    command.extend(['-m', basename(manifest_xml)])
-  check_call(command, cwd = aosp_root)
+    utils.makedirs_if_needed(aosp_root)
+    command = ['repo', 'init', '-u', url]
+    if (shallow):
+        command.extend(['--depth=1'])
+    if (branch):
+        command.extend(['-b', branch])
+    else:
+        manifests_dir = join(aosp_root, '.repo', 'manifests')
+        utils.makedirs_if_needed(manifests_dir)
+        copy2(manifest_xml, manifests_dir)
+        command.extend(['-m', basename(manifest_xml)])
+    check_call(command, cwd=aosp_root)
 
-  check_call(['repo', 'sync', '-dq', '-j' + concurrency], cwd = aosp_root)
+    check_call(['repo', 'sync', '-dq', '-j' + concurrency], cwd=aosp_root)
+
 
 def parse_arguments():
-  parser = argparse.ArgumentParser(
-      description = 'Checkout the AOSP source tree.')
-  utils_aosp.add_root_argument(parser)
-  parser.add_argument('--url',
-                      help='URL the repo. ' +
-                           'Defaults to ' + AOSP_MANIFEST_URL + '.',
-                      default=AOSP_MANIFEST_URL)
-  parser.add_argument('--manifest',
-                      help='Manifest to use for the checkout. ' +
-                           'Defaults to ' + AOSP_MANIFEST_XML + '.',
-                      default=AOSP_MANIFEST_XML)
-  parser.add_argument('--branch',
-                      help='Branch to checkout. This overrides ' +
-                           'passing --manifest')
-  parser.add_argument('--shallow',
-                      action = 'store_true',
-                      help='Shallow checkout.')
-  parser.add_argument('-j',
-                      help='Projects to fetch simultaneously. ' +
-                           'Defaults to ' + str(J_DEFAULT) + '.',
-                      default=str(J_DEFAULT))
-  return parser.parse_args()
+    parser = argparse.ArgumentParser(
+        description='Checkout the AOSP source tree.')
+    utils_aosp.add_root_argument(parser)
+    parser.add_argument('--url',
+                        help='URL the repo. ' + 'Defaults to ' +
+                        AOSP_MANIFEST_URL + '.',
+                        default=AOSP_MANIFEST_URL)
+    parser.add_argument('--manifest',
+                        help='Manifest to use for the checkout. ' +
+                        'Defaults to ' + AOSP_MANIFEST_XML + '.',
+                        default=AOSP_MANIFEST_XML)
+    parser.add_argument('--branch',
+                        help='Branch to checkout. This overrides ' +
+                        'passing --manifest')
+    parser.add_argument('--shallow',
+                        action='store_true',
+                        help='Shallow checkout.')
+    parser.add_argument('-j',
+                        help='Projects to fetch simultaneously. ' +
+                        'Defaults to ' + str(J_DEFAULT) + '.',
+                        default=str(J_DEFAULT))
+    return parser.parse_args()
+
 
 def Main():
-  args = parse_arguments()
-  checkout_aosp(args.aosp_root, args.url, args.branch, args.manifest,
-                args.j, args.shallow)
+    args = parse_arguments()
+    checkout_aosp(args.aosp_root, args.url, args.branch, args.manifest, args.j,
+                  args.shallow)
+
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
