فهرست منبع

Drop py2 support in recipe modules

python3 is the only supported version of python in depot_tools.

Bug: 1475402
Change-Id: I479de09a0c34b438aced35e4ced58a5972108132
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/4808518
Reviewed-by: Josip Sokcevic <sokcevic@chromium.org>
Commit-Queue: Gavin Mak <gavinmak@google.com>
Gavin Mak 2 سال پیش
والد
کامیت
5819c303f0
49فایلهای تغییر یافته به همراه97 افزوده شده و 152 حذف شده
  1. 41 41
      recipes/README.recipes.md
  2. 1 1
      recipes/recipe_modules/bot_update/__init__.py
  3. 1 1
      recipes/recipe_modules/bot_update/examples/full.py
  4. 6 26
      recipes/recipe_modules/bot_update/resources/bot_update.py
  5. 1 1
      recipes/recipe_modules/bot_update/tests/do_not_retry_patch_failures_in_cq.py
  6. 1 1
      recipes/recipe_modules/bot_update/tests/download_topics.py
  7. 1 1
      recipes/recipe_modules/bot_update/tests/ensure_checkout.py
  8. 1 1
      recipes/recipe_modules/depot_tools/__init__.py
  9. 1 1
      recipes/recipe_modules/depot_tools/examples/full.py
  10. 1 7
      recipes/recipe_modules/gclient/api.py
  11. 1 1
      recipes/recipe_modules/gclient/examples/full.py
  12. 0 1
      recipes/recipe_modules/gclient/resources/cleanup.py
  13. 0 2
      recipes/recipe_modules/gclient/resources/diff_deps.py
  14. 1 1
      recipes/recipe_modules/gclient/tests/diff_deps.py
  15. 1 1
      recipes/recipe_modules/gclient/tests/patch_project.py
  16. 1 1
      recipes/recipe_modules/gclient/tests/sync_failure.py
  17. 1 1
      recipes/recipe_modules/gerrit/__init__.py
  18. 1 1
      recipes/recipe_modules/gerrit/examples/full.py
  19. 1 1
      recipes/recipe_modules/git/__init__.py
  20. 1 10
      recipes/recipe_modules/git/api.py
  21. 1 1
      recipes/recipe_modules/git/examples/full.expected/new_branch_failed.json
  22. 1 1
      recipes/recipe_modules/git/examples/full.py
  23. 1 1
      recipes/recipe_modules/git/tests/number.py
  24. 1 1
      recipes/recipe_modules/git_cl/__init__.py
  25. 1 1
      recipes/recipe_modules/gitiles/__init__.py
  26. 4 13
      recipes/recipe_modules/gitiles/api.py
  27. 1 1
      recipes/recipe_modules/gitiles/examples/full.py
  28. 3 11
      recipes/recipe_modules/gitiles/resources/gerrit_client.py
  29. 1 1
      recipes/recipe_modules/gitiles/tests/parse_repo_url.py
  30. 1 1
      recipes/recipe_modules/gsutil/__init__.py
  31. 1 1
      recipes/recipe_modules/gsutil/examples/custom_boto.py
  32. 1 1
      recipes/recipe_modules/gsutil/examples/full.py
  33. 1 1
      recipes/recipe_modules/osx_sdk/__init__.py
  34. 1 1
      recipes/recipe_modules/osx_sdk/examples/full.py
  35. 1 1
      recipes/recipe_modules/presubmit/__init__.py
  36. 1 1
      recipes/recipe_modules/presubmit/examples/full.py
  37. 1 1
      recipes/recipe_modules/presubmit/tests/execute.py
  38. 1 1
      recipes/recipe_modules/presubmit/tests/prepare.py
  39. 1 1
      recipes/recipe_modules/tryserver/__init__.py
  40. 1 1
      recipes/recipe_modules/tryserver/examples/full.py
  41. 1 1
      recipes/recipe_modules/tryserver/tests/gerrit_change_fetch_ref_timeout.py
  42. 1 1
      recipes/recipe_modules/tryserver/tests/gerrit_change_owner.py
  43. 1 1
      recipes/recipe_modules/tryserver/tests/gerrit_change_target_ref.py
  44. 1 1
      recipes/recipe_modules/tryserver/tests/get_change_description.py
  45. 1 1
      recipes/recipe_modules/tryserver/tests/get_files_affected_by_patch.py
  46. 1 1
      recipes/recipe_modules/tryserver/tests/get_footers.py
  47. 1 1
      recipes/recipe_modules/tryserver/tests/require_is_tryserver.py
  48. 1 1
      recipes/recipe_modules/windows_sdk/__init__.py
  49. 1 1
      recipes/recipe_modules/windows_sdk/examples/full.py

+ 41 - 41
recipes/README.recipes.md

@@ -164,30 +164,30 @@ Returns (Path): The "depot_tools" root directory.
 [DEPS](/recipes/recipe_modules/gclient/__init__.py#1): [git](#recipe_modules-git), [gitiles](#recipe_modules-gitiles), [tryserver](#recipe_modules-tryserver), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
 [DEPS](/recipes/recipe_modules/gclient/__init__.py#1): [git](#recipe_modules-git), [gitiles](#recipe_modules-gitiles), [tryserver](#recipe_modules-tryserver), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
 
 
 
 
-#### **class [GclientApi](/recipes/recipe_modules/gclient/api.py#77)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
+#### **class [GclientApi](/recipes/recipe_modules/gclient/api.py#71)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
 
 
-&emsp; **@property**<br>&mdash; **def [DepsDiffException](/recipes/recipe_modules/gclient/api.py#424)(self):**
+&emsp; **@property**<br>&mdash; **def [DepsDiffException](/recipes/recipe_modules/gclient/api.py#418)(self):**
 
 
-&mdash; **def [\_\_call\_\_](/recipes/recipe_modules/gclient/api.py#87)(self, name, cmd, infra_step=True, \*\*kwargs):**
+&mdash; **def [\_\_call\_\_](/recipes/recipe_modules/gclient/api.py#81)(self, name, cmd, infra_step=True, \*\*kwargs):**
 
 
 Wrapper for easy calling of gclient steps.
 Wrapper for easy calling of gclient steps.
 
 
-&mdash; **def [break\_locks](/recipes/recipe_modules/gclient/api.py#291)(self):**
+&mdash; **def [break\_locks](/recipes/recipe_modules/gclient/api.py#285)(self):**
 
 
 Remove all index.lock files. If a previous run of git crashed, bot was
 Remove all index.lock files. If a previous run of git crashed, bot was
 reset, etc... we might end up with leftover index.lock files.
 reset, etc... we might end up with leftover index.lock files.
 
 
-&mdash; **def [checkout](/recipes/recipe_modules/gclient/api.py#251)(self, gclient_config=None, revert=RevertOnTryserver, inject_parent_got_revision=True, extra_sync_flags=None, \*\*kwargs):**
+&mdash; **def [checkout](/recipes/recipe_modules/gclient/api.py#245)(self, gclient_config=None, revert=RevertOnTryserver, inject_parent_got_revision=True, extra_sync_flags=None, \*\*kwargs):**
 
 
 Return a step generator function for gclient checkouts.
 Return a step generator function for gclient checkouts.
 
 
-&emsp; **@staticmethod**<br>&mdash; **def [config\_to\_pythonish](/recipes/recipe_modules/gclient/api.py#139)(cfg):**
+&emsp; **@staticmethod**<br>&mdash; **def [config\_to\_pythonish](/recipes/recipe_modules/gclient/api.py#133)(cfg):**
 
 
-&mdash; **def [diff\_deps](/recipes/recipe_modules/gclient/api.py#367)(self, cwd):**
+&mdash; **def [diff\_deps](/recipes/recipe_modules/gclient/api.py#361)(self, cwd):**
 
 
-&mdash; **def [get\_config\_defaults](/recipes/recipe_modules/gclient/api.py#133)(self):**
+&mdash; **def [get\_config\_defaults](/recipes/recipe_modules/gclient/api.py#127)(self):**
 
 
-&mdash; **def [get\_gerrit\_patch\_root](/recipes/recipe_modules/gclient/api.py#298)(self, gclient_config=None):**
+&mdash; **def [get\_gerrit\_patch\_root](/recipes/recipe_modules/gclient/api.py#292)(self, gclient_config=None):**
 
 
 Returns local path to the repo where gerrit patch will be applied.
 Returns local path to the repo where gerrit patch will be applied.
 
 
@@ -200,7 +200,7 @@ Instead, properly map a repository to a local path using repo_path_map.
 TODO(nodir): remove this. Update all recipe tests to specify a git_repo
 TODO(nodir): remove this. Update all recipe tests to specify a git_repo
 matching the recipe.
 matching the recipe.
 
 
-&mdash; **def [get\_repo\_path](/recipes/recipe_modules/gclient/api.py#325)(self, repo_url, gclient_config=None):**
+&mdash; **def [get\_repo\_path](/recipes/recipe_modules/gclient/api.py#319)(self, repo_url, gclient_config=None):**
 
 
 Returns local path to the repo checkout given its url.
 Returns local path to the repo checkout given its url.
 
 
@@ -208,7 +208,7 @@ Consults cfg.repo_path_map and fallbacks to urls in configured solutions.
 
 
 Returns None if not found.
 Returns None if not found.
 
 
-&emsp; **@staticmethod**<br>&mdash; **def [got\_revision\_reverse\_mapping](/recipes/recipe_modules/gclient/api.py#144)(cfg):**
+&emsp; **@staticmethod**<br>&mdash; **def [got\_revision\_reverse\_mapping](/recipes/recipe_modules/gclient/api.py#138)(cfg):**
 
 
 Returns the merged got_revision_reverse_mapping.
 Returns the merged got_revision_reverse_mapping.
 
 
@@ -216,7 +216,7 @@ Returns (dict): A mapping from property name -> project name. It merges the
     values of the deprecated got_revision_mapping and the new
     values of the deprecated got_revision_mapping and the new
     got_revision_reverse_mapping.
     got_revision_reverse_mapping.
 
 
-&mdash; **def [inject\_parent\_got\_revision](/recipes/recipe_modules/gclient/api.py#226)(self, gclient_config=None, override=False):**
+&mdash; **def [inject\_parent\_got\_revision](/recipes/recipe_modules/gclient/api.py#220)(self, gclient_config=None, override=False):**
 
 
 Match gclient config to build revisions obtained from build_properties.
 Match gclient config to build revisions obtained from build_properties.
 
 
@@ -226,9 +226,9 @@ Args:
   override (bool) - If True, will forcibly set revision and custom_vars
   override (bool) - If True, will forcibly set revision and custom_vars
     even if the config already contains values for them.
     even if the config already contains values for them.
 
 
-&mdash; **def [resolve\_revision](/recipes/recipe_modules/gclient/api.py#161)(self, revision):**
+&mdash; **def [resolve\_revision](/recipes/recipe_modules/gclient/api.py#155)(self, revision):**
 
 
-&mdash; **def [roll\_deps](/recipes/recipe_modules/gclient/api.py#428)(self, deps_path, dep_updates, strip_prefix_for_gitlink=None, test_data=None):**
+&mdash; **def [roll\_deps](/recipes/recipe_modules/gclient/api.py#422)(self, deps_path, dep_updates, strip_prefix_for_gitlink=None, test_data=None):**
 
 
 Updates DEPS file to desired revisions, and returns all requried file
 Updates DEPS file to desired revisions, and returns all requried file
 changes.
 changes.
@@ -249,20 +249,20 @@ Returns:
   commit hash.
   commit hash.
   Note: we expect DEPS to be in the root of the project.
   Note: we expect DEPS to be in the root of the project.
 
 
-&mdash; **def [runhooks](/recipes/recipe_modules/gclient/api.py#285)(self, args=None, name='runhooks', \*\*kwargs):**
+&mdash; **def [runhooks](/recipes/recipe_modules/gclient/api.py#279)(self, args=None, name='runhooks', \*\*kwargs):**
 
 
-&mdash; **def [set\_patch\_repo\_revision](/recipes/recipe_modules/gclient/api.py#355)(self, gclient_config=None):**
+&mdash; **def [set\_patch\_repo\_revision](/recipes/recipe_modules/gclient/api.py#349)(self, gclient_config=None):**
 
 
 Updates config revision corresponding to patched project.
 Updates config revision corresponding to patched project.
 
 
 Useful for bot_update only, as this is the only consumer of gclient's config
 Useful for bot_update only, as this is the only consumer of gclient's config
 revision map. This doesn't overwrite the revision if it was already set.
 revision map. This doesn't overwrite the revision if it was already set.
 
 
-&emsp; **@spec_alias.deleter**<br>&mdash; **def [spec\_alias](/recipes/recipe_modules/gclient/api.py#129)(self):**
+&emsp; **@spec_alias.deleter**<br>&mdash; **def [spec\_alias](/recipes/recipe_modules/gclient/api.py#123)(self):**
 
 
-&mdash; **def [sync](/recipes/recipe_modules/gclient/api.py#166)(self, cfg, extra_sync_flags=None, \*\*kwargs):**
+&mdash; **def [sync](/recipes/recipe_modules/gclient/api.py#160)(self, cfg, extra_sync_flags=None, \*\*kwargs):**
 
 
-&emsp; **@use_mirror.setter**<br>&mdash; **def [use\_mirror](/recipes/recipe_modules/gclient/api.py#116)(self, val):**
+&emsp; **@use_mirror.setter**<br>&mdash; **def [use\_mirror](/recipes/recipe_modules/gclient/api.py#110)(self, val):**
 ### *recipe_modules* / [gerrit](/recipes/recipe_modules/gerrit)
 ### *recipe_modules* / [gerrit](/recipes/recipe_modules/gerrit)
 
 
 [DEPS](/recipes/recipe_modules/gerrit/__init__.py#3): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time]
 [DEPS](/recipes/recipe_modules/gerrit/__init__.py#3): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time]
@@ -406,13 +406,13 @@ Returns:
 [DEPS](/recipes/recipe_modules/git/__init__.py#3): [depot\_tools](#recipe_modules-depot_tools), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
 [DEPS](/recipes/recipe_modules/git/__init__.py#3): [depot\_tools](#recipe_modules-depot_tools), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
 
 
 
 
-#### **class [GitApi](/recipes/recipe_modules/git/api.py#19)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
+#### **class [GitApi](/recipes/recipe_modules/git/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
 
 
-&mdash; **def [\_\_call\_\_](/recipes/recipe_modules/git/api.py#22)(self, \*args, \*\*kwargs):**
+&mdash; **def [\_\_call\_\_](/recipes/recipe_modules/git/api.py#14)(self, \*args, \*\*kwargs):**
 
 
 Returns a git command step.
 Returns a git command step.
 
 
-&mdash; **def [bundle\_create](/recipes/recipe_modules/git/api.py#382)(self, bundle_path, rev_list_args=None, \*\*kwargs):**
+&mdash; **def [bundle\_create](/recipes/recipe_modules/git/api.py#373)(self, bundle_path, rev_list_args=None, \*\*kwargs):**
 
 
 Runs 'git bundle create' on a Git repository.
 Runs 'git bundle create' on a Git repository.
 
 
@@ -422,11 +422,11 @@ Args:
       refs in the Git checkout will be bundled.
       refs in the Git checkout will be bundled.
   * kwargs: Forwarded to '__call__'.
   * kwargs: Forwarded to '__call__'.
 
 
-&mdash; **def [cat\_file\_at\_commit](/recipes/recipe_modules/git/api.py#42)(self, file_path, commit_hash, remote_name=None, \*\*kwargs):**
+&mdash; **def [cat\_file\_at\_commit](/recipes/recipe_modules/git/api.py#34)(self, file_path, commit_hash, remote_name=None, \*\*kwargs):**
 
 
 Outputs the contents of a file at a given revision.
 Outputs the contents of a file at a given revision.
 
 
-&mdash; **def [checkout](/recipes/recipe_modules/git/api.py#116)(self, url, ref=None, dir_path=None, recursive=False, submodules=True, submodule_update_force=False, keep_paths=None, step_suffix=None, curl_trace_file=None, raise_on_failure=True, set_got_revision=False, remote_name=None, display_fetch_size=None, file_name=None, submodule_update_recursive=True, use_git_cache=False, progress=True, tags=False):**
+&mdash; **def [checkout](/recipes/recipe_modules/git/api.py#107)(self, url, ref=None, dir_path=None, recursive=False, submodules=True, submodule_update_force=False, keep_paths=None, step_suffix=None, curl_trace_file=None, raise_on_failure=True, set_got_revision=False, remote_name=None, display_fetch_size=None, file_name=None, submodule_update_recursive=True, use_git_cache=False, progress=True, tags=False):**
 
 
 Performs a full git checkout and returns sha1 of checked out revision.
 Performs a full git checkout and returns sha1 of checked out revision.
 
 
@@ -465,7 +465,7 @@ Args:
 Returns: If the checkout was successful, this returns the commit hash of
 Returns: If the checkout was successful, this returns the commit hash of
   the checked-out-repo. Otherwise this returns None.
   the checked-out-repo. Otherwise this returns None.
 
 
-&mdash; **def [config\_get](/recipes/recipe_modules/git/api.py#351)(self, prop_name, \*\*kwargs):**
+&mdash; **def [config\_get](/recipes/recipe_modules/git/api.py#342)(self, prop_name, \*\*kwargs):**
 
 
 Returns git config output.
 Returns git config output.
 
 
@@ -475,7 +475,7 @@ Args:
 
 
 Returns: (str) The Git config output, or None if no output was generated.
 Returns: (str) The Git config output, or None if no output was generated.
 
 
-&mdash; **def [count\_objects](/recipes/recipe_modules/git/api.py#50)(self, previous_result=None, raise_on_failure=False, \*\*kwargs):**
+&mdash; **def [count\_objects](/recipes/recipe_modules/git/api.py#42)(self, previous_result=None, raise_on_failure=False, \*\*kwargs):**
 
 
 Returns `git count-objects` result as a dict.
 Returns `git count-objects` result as a dict.
 
 
@@ -488,11 +488,11 @@ Args:
 Returns:
 Returns:
   A dict of count-object values, or None if count-object run failed.
   A dict of count-object values, or None if count-object run failed.
 
 
-&mdash; **def [fetch\_tags](/recipes/recipe_modules/git/api.py#36)(self, remote_name=None, \*\*kwargs):**
+&mdash; **def [fetch\_tags](/recipes/recipe_modules/git/api.py#28)(self, remote_name=None, \*\*kwargs):**
 
 
 Fetches all tags from the remote.
 Fetches all tags from the remote.
 
 
-&mdash; **def [get\_remote\_url](/recipes/recipe_modules/git/api.py#370)(self, remote_name=None, \*\*kwargs):**
+&mdash; **def [get\_remote\_url](/recipes/recipe_modules/git/api.py#361)(self, remote_name=None, \*\*kwargs):**
 
 
 Returns the remote Git repository URL, or None.
 Returns the remote Git repository URL, or None.
 
 
@@ -502,11 +502,11 @@ Args:
 
 
 Returns: (str) The URL of the remote Git repository, or None.
 Returns: (str) The URL of the remote Git repository, or None.
 
 
-&mdash; **def [get\_timestamp](/recipes/recipe_modules/git/api.py#322)(self, commit='HEAD', test_data=None, \*\*kwargs):**
+&mdash; **def [get\_timestamp](/recipes/recipe_modules/git/api.py#313)(self, commit='HEAD', test_data=None, \*\*kwargs):**
 
 
 Find and return the timestamp of the given commit.
 Find and return the timestamp of the given commit.
 
 
-&mdash; **def [new\_branch](/recipes/recipe_modules/git/api.py#395)(self, branch, name=None, upstream=None, upstream_current=False, \*\*kwargs):**
+&mdash; **def [new\_branch](/recipes/recipe_modules/git/api.py#386)(self, branch, name=None, upstream=None, upstream_current=False, \*\*kwargs):**
 
 
 Runs git new-branch on a Git repository, to be used before git cl
 Runs git new-branch on a Git repository, to be used before git cl
 upload.
 upload.
@@ -518,7 +518,7 @@ Args:
   * upstream_current (bool): whether to use '--upstream_current'.
   * upstream_current (bool): whether to use '--upstream_current'.
   * kwargs: Forwarded to '__call__'.
   * kwargs: Forwarded to '__call__'.
 
 
-&mdash; **def [number](/recipes/recipe_modules/git/api.py#426)(self, commitrefs=None, test_values=None):**
+&mdash; **def [number](/recipes/recipe_modules/git/api.py#417)(self, commitrefs=None, test_values=None):**
 
 
 Computes the generation number of some commits.
 Computes the generation number of some commits.
 
 
@@ -535,7 +535,7 @@ A list of strings containing the generation numbers of the commits.
 If non-empty commitrefs was provided, the order of the returned
 If non-empty commitrefs was provided, the order of the returned
 numbers will correspond to the order of the provided commitrefs.
 numbers will correspond to the order of the provided commitrefs.
 
 
-&mdash; **def [rebase](/recipes/recipe_modules/git/api.py#331)(self, name_prefix, branch, dir_path, remote_name=None, \*\*kwargs):**
+&mdash; **def [rebase](/recipes/recipe_modules/git/api.py#322)(self, name_prefix, branch, dir_path, remote_name=None, \*\*kwargs):**
 
 
 Runs rebase HEAD onto branch
 Runs rebase HEAD onto branch
 
 
@@ -574,16 +574,16 @@ If you set `path` to None, this will remove the default.
 [DEPS](/recipes/recipe_modules/gitiles/__init__.py#7): [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/url][recipe_engine/recipe_modules/url]
 [DEPS](/recipes/recipe_modules/gitiles/__init__.py#7): [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/url][recipe_engine/recipe_modules/url]
 
 
 
 
-#### **class [Gitiles](/recipes/recipe_modules/gitiles/api.py#18)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
+#### **class [Gitiles](/recipes/recipe_modules/gitiles/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
 
 
 Module for polling a git repository using the Gitiles web interface.
 Module for polling a git repository using the Gitiles web interface.
 
 
-&mdash; **def [canonicalize\_repo\_url](/recipes/recipe_modules/gitiles/api.py#231)(self, repo_url):**
+&mdash; **def [canonicalize\_repo\_url](/recipes/recipe_modules/gitiles/api.py#222)(self, repo_url):**
 
 
 Returns a canonical form of repo_url. If not recognized, returns as is.
 Returns a canonical form of repo_url. If not recognized, returns as is.
     
     
 
 
-&mdash; **def [commit\_log](/recipes/recipe_modules/gitiles/api.py#121)(self, url, commit, step_name=None, attempts=None):**
+&mdash; **def [commit\_log](/recipes/recipe_modules/gitiles/api.py#114)(self, url, commit, step_name=None, attempts=None):**
 
 
 Returns: (dict) the Gitiles commit log structure for a given commit.
 Returns: (dict) the Gitiles commit log structure for a given commit.
 
 
@@ -593,7 +593,7 @@ Args:
   * step_name (str): If not None, override the step name.
   * step_name (str): If not None, override the step name.
   * attempts (int): Number of times to try the request before failing.
   * attempts (int): Number of times to try the request before failing.
 
 
-&mdash; **def [download\_archive](/recipes/recipe_modules/gitiles/api.py#171)(self, repository_url, destination, revision='refs/heads/main'):**
+&mdash; **def [download\_archive](/recipes/recipe_modules/gitiles/api.py#162)(self, repository_url, destination, revision='refs/heads/main'):**
 
 
 Downloads an archive of the repo and extracts it to `destination`.
 Downloads an archive of the repo and extracts it to `destination`.
 
 
@@ -609,7 +609,7 @@ Args:
   * revision (str): The ref or revision in the repo to download. Defaults to
   * revision (str): The ref or revision in the repo to download. Defaults to
     'refs/heads/main'.
     'refs/heads/main'.
 
 
-&mdash; **def [download\_file](/recipes/recipe_modules/gitiles/api.py#137)(self, repository_url, file_path, branch='main', step_name=None, attempts=None, \*\*kwargs):**
+&mdash; **def [download\_file](/recipes/recipe_modules/gitiles/api.py#130)(self, repository_url, file_path, branch='main', step_name=None, attempts=None, \*\*kwargs):**
 
 
 Downloads raw file content from a Gitiles repository.
 Downloads raw file content from a Gitiles repository.
 
 
@@ -623,7 +623,7 @@ Args:
 Returns:
 Returns:
   Raw file content.
   Raw file content.
 
 
-&mdash; **def [log](/recipes/recipe_modules/gitiles/api.py#75)(self, url, ref, limit=0, cursor=None, step_name=None, attempts=None, \*\*kwargs):**
+&mdash; **def [log](/recipes/recipe_modules/gitiles/api.py#68)(self, url, ref, limit=0, cursor=None, step_name=None, attempts=None, \*\*kwargs):**
 
 
 Returns the most recent commits under the given ref with properties.
 Returns the most recent commits under the given ref with properties.
 
 
@@ -646,17 +646,17 @@ Returns:
   Cursor can be used for subsequent calls to log for paging. If None,
   Cursor can be used for subsequent calls to log for paging. If None,
   signals that there are no more commits to fetch.
   signals that there are no more commits to fetch.
 
 
-&mdash; **def [parse\_repo\_url](/recipes/recipe_modules/gitiles/api.py#220)(self, repo_url):**
+&mdash; **def [parse\_repo\_url](/recipes/recipe_modules/gitiles/api.py#211)(self, repo_url):**
 
 
 Returns (host, project) pair.
 Returns (host, project) pair.
 
 
 Returns (None, None) if repo_url is not recognized.
 Returns (None, None) if repo_url is not recognized.
 
 
-&mdash; **def [refs](/recipes/recipe_modules/gitiles/api.py#63)(self, url, step_name='refs', attempts=None):**
+&mdash; **def [refs](/recipes/recipe_modules/gitiles/api.py#56)(self, url, step_name='refs', attempts=None):**
 
 
 Returns a list of refs in the remote repository.
 Returns a list of refs in the remote repository.
 
 
-&mdash; **def [unparse\_repo\_url](/recipes/recipe_modules/gitiles/api.py#227)(self, host, project):**
+&mdash; **def [unparse\_repo\_url](/recipes/recipe_modules/gitiles/api.py#218)(self, host, project):**
 
 
 Generates a Gitiles repo URL. See also parse_repo_url.
 Generates a Gitiles repo URL. See also parse_repo_url.
 ### *recipe_modules* / [gsutil](/recipes/recipe_modules/gsutil)
 ### *recipe_modules* / [gsutil](/recipes/recipe_modules/gsutil)

+ 1 - 1
recipes/recipe_modules/bot_update/__init__.py

@@ -1,4 +1,4 @@
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'depot_tools',
     'depot_tools',

+ 1 - 1
recipes/recipe_modules/bot_update/examples/full.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'bot_update',
   'bot_update',

+ 6 - 26
recipes/recipe_modules/bot_update/resources/bot_update.py

@@ -5,9 +5,6 @@
 
 
 # TODO(hinoka): Use logging.
 # TODO(hinoka): Use logging.
 
 
-from __future__ import division
-from __future__ import print_function
-
 import codecs
 import codecs
 from contextlib import contextmanager
 from contextlib import contextmanager
 import copy
 import copy
@@ -28,18 +25,8 @@ import uuid
 
 
 import os.path as path
 import os.path as path
 
 
-# TODO(crbug.com/1227140): Clean up when py2 is no longer supported.
 from io import BytesIO
 from io import BytesIO
-try:
-  import urlparse
-except ImportError:  # pragma: no cover
-  import urllib.parse as urlparse
-
-# Cache the string-escape codec to ensure subprocess can find it later.
-# See crbug.com/912292#c2 for context.
-# TODO(crbug.com/1227140): Clean up when py2 is no longer supported.
-if sys.version_info.major == 2:
-  codecs.lookup('string-escape')
+from urllib.parse import urlparse
 
 
 # How many bytes at a time to read from pipes.
 # How many bytes at a time to read from pipes.
 BUF_SIZE = 256
 BUF_SIZE = 256
@@ -169,13 +156,6 @@ def _kill_process(proc):
   proc.kill()
   proc.kill()
 
 
 
 
-# TODO(crbug.com/1227140): Clean up when py2 is no longer supported.
-def _stdout_write(buf):
-  try:
-    sys.stdout.buffer.write(buf)
-  except AttributeError:
-    sys.stdout.write(buf)
-
 
 
 def call(*args, **kwargs):  # pragma: no cover
 def call(*args, **kwargs):  # pragma: no cover
   """Interactive subprocess call."""
   """Interactive subprocess call."""
@@ -235,10 +215,10 @@ def call(*args, **kwargs):  # pragma: no cover
       if hanging_cr:
       if hanging_cr:
         buf = buf[:-1]
         buf = buf[:-1]
       buf = buf.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
       buf = buf.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
-      _stdout_write(buf)
+      sys.stdout.buffer.write(buf)
       out.write(buf)
       out.write(buf)
     if hanging_cr:
     if hanging_cr:
-      _stdout_write(b'\n')
+      sys.stdout.buffer.write(b'\n')
       out.write(b'\n')
       out.write(b'\n')
 
 
     code = proc.wait()
     code = proc.wait()
@@ -331,7 +311,7 @@ def modify_solutions(input_solutions):
   solutions = copy.deepcopy(input_solutions)
   solutions = copy.deepcopy(input_solutions)
   for solution in solutions:
   for solution in solutions:
     original_url = solution['url']
     original_url = solution['url']
-    parsed_url = urlparse.urlparse(original_url)
+    parsed_url = urlparse(original_url)
     parsed_path = parsed_url.path
     parsed_path = parsed_url.path
 
 
     solution['managed'] = False
     solution['managed'] = False
@@ -478,7 +458,7 @@ def normalize_git_url(url):
   * Do not contain /a/ in their path.
   * Do not contain /a/ in their path.
   """
   """
   try:
   try:
-    p = urlparse.urlparse(url)
+    p = urlparse(url)
   except Exception:
   except Exception:
     # Not a url, just return it back.
     # Not a url, just return it back.
     return url
     return url
@@ -893,7 +873,7 @@ def parse_revisions(revisions, root):
       # This is an alt_root@revision argument.
       # This is an alt_root@revision argument.
       current_root, current_rev = split_revision
       current_root, current_rev = split_revision
 
 
-      parsed_root = urlparse.urlparse(current_root)
+      parsed_root = urlparse(current_root)
       if parsed_root.scheme in ['http', 'https']:
       if parsed_root.scheme in ['http', 'https']:
         # We want to normalize git urls into .git urls.
         # We want to normalize git urls into .git urls.
         normalized_root = 'https://' + parsed_root.netloc + parsed_root.path
         normalized_root = 'https://' + parsed_root.netloc + parsed_root.path

+ 1 - 1
recipes/recipe_modules/bot_update/tests/do_not_retry_patch_failures_in_cq.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'bot_update',
     'bot_update',

+ 1 - 1
recipes/recipe_modules/bot_update/tests/download_topics.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'bot_update',
   'bot_update',

+ 1 - 1
recipes/recipe_modules/bot_update/tests/ensure_checkout.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'bot_update',
   'bot_update',

+ 1 - 1
recipes/recipe_modules/depot_tools/__init__.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'recipe_engine/cipd',
   'recipe_engine/cipd',

+ 1 - 1
recipes/recipe_modules/depot_tools/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'depot_tools',
   'depot_tools',

+ 1 - 7
recipes/recipe_modules/gclient/api.py

@@ -4,12 +4,6 @@
 
 
 import re
 import re
 
 
-# TODO(crbug.com/1227140): Clean up when py2 is no longer supported.
-try:
-  _STRING_TYPE = basestring
-except NameError:  # pragma: no cover
-  _STRING_TYPE = str
-
 from recipe_engine import recipe_api
 from recipe_engine import recipe_api
 
 
 class DepsDiffException(Exception):
 class DepsDiffException(Exception):
@@ -68,7 +62,7 @@ def jsonish_to_python(spec, is_top=False):
       ret += '['
       ret += '['
       ret += ', '.join(jsonish_to_python(x) for x in spec)
       ret += ', '.join(jsonish_to_python(x) for x in spec)
       ret += ']'
       ret += ']'
-    elif isinstance(spec, _STRING_TYPE):
+    elif isinstance(spec, str):
       ret = repr(str(spec))
       ret = repr(str(spec))
     else:
     else:
       ret = repr(spec)
       ret = repr(spec)

+ 1 - 1
recipes/recipe_modules/gclient/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'gclient',
     'gclient',

+ 0 - 1
recipes/recipe_modules/gclient/resources/cleanup.py

@@ -1,6 +1,5 @@
 #!/usr/bin/env python3
 #!/usr/bin/env python3
 
 
-from __future__ import print_function
 import os, sys
 import os, sys
 
 
 build_path = sys.argv[1]
 build_path = sys.argv[1]

+ 0 - 2
recipes/recipe_modules/gclient/resources/diff_deps.py

@@ -1,7 +1,5 @@
 #!/usr/bin/env python3
 #!/usr/bin/env python3
 
 
-from __future__ import print_function
-
 import os
 import os
 import subprocess
 import subprocess
 import sys
 import sys

+ 1 - 1
recipes/recipe_modules/gclient/tests/diff_deps.py

@@ -5,7 +5,7 @@
 from recipe_engine.post_process import (DropExpectation, StatusSuccess,
 from recipe_engine.post_process import (DropExpectation, StatusSuccess,
                                         SummaryMarkdown)
                                         SummaryMarkdown)
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'recipe_engine/assertions',
   'recipe_engine/assertions',

+ 1 - 1
recipes/recipe_modules/gclient/tests/patch_project.py

@@ -6,7 +6,7 @@ from recipe_engine import post_process
 from recipe_engine import recipe_api
 from recipe_engine import recipe_api
 
 
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'recipe_engine/buildbucket',
   'recipe_engine/buildbucket',

+ 1 - 1
recipes/recipe_modules/gclient/tests/sync_failure.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'recipe_engine/path',
   'recipe_engine/path',

+ 1 - 1
recipes/recipe_modules/gerrit/__init__.py

@@ -1,4 +1,4 @@
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'recipe_engine/context',
     'recipe_engine/context',

+ 1 - 1
recipes/recipe_modules/gerrit/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'gerrit',
     'gerrit',

+ 1 - 1
recipes/recipe_modules/git/__init__.py

@@ -1,4 +1,4 @@
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'depot_tools',
   'depot_tools',

+ 1 - 10
recipes/recipe_modules/git/api.py

@@ -2,17 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-from __future__ import division
-
 import itertools
 import itertools
 import re
 import re
 
 
-# TODO(crbug.com/1227140): Clean up when py2 is no longer supported.
-try:
-  _INTEGER_TYPES = (int, long)
-except NameError:  # pragma: no cover
-  _INTEGER_TYPES = (int,)
-
 from recipe_engine import recipe_api
 from recipe_engine import recipe_api
 from recipe_engine import util as recipe_util
 from recipe_engine import util as recipe_util
 
 
@@ -61,8 +53,7 @@ class GitApi(recipe_api.RecipeApi):
     """
     """
     if previous_result:
     if previous_result:
       assert isinstance(previous_result, dict)
       assert isinstance(previous_result, dict)
-      assert all(
-          isinstance(v, _INTEGER_TYPES) for v in previous_result.values())
+      assert all(isinstance(v, int) for v in previous_result.values())
       assert 'size' in previous_result
       assert 'size' in previous_result
       assert 'size-pack' in previous_result
       assert 'size-pack' in previous_result
 
 

+ 1 - 1
recipes/recipe_modules/git/examples/full.expected/new_branch_failed.json

@@ -184,7 +184,7 @@
       "Traceback (most recent call last):",
       "Traceback (most recent call last):",
       "  File \"RECIPE_REPO[depot_tools]/recipes/recipe_modules/git/examples/full.py\", line 81, in RunSteps",
       "  File \"RECIPE_REPO[depot_tools]/recipes/recipe_modules/git/examples/full.py\", line 81, in RunSteps",
       "    api.git.new_branch('failed_new_branch', upstream='will_fail', upstream_current=True) #pylint: disable = line-too-long",
       "    api.git.new_branch('failed_new_branch', upstream='will_fail', upstream_current=True) #pylint: disable = line-too-long",
-      "  File \"RECIPE_REPO[depot_tools]/recipes/recipe_modules/git/api.py\", line 412, in new_branch",
+      "  File \"RECIPE_REPO[depot_tools]/recipes/recipe_modules/git/api.py\", line 403, in new_branch",
       "    raise ValueError('Can not define both upstream and upstream_current')",
       "    raise ValueError('Can not define both upstream and upstream_current')",
       "ValueError('Can not define both upstream and upstream_current')"
       "ValueError('Can not define both upstream and upstream_current')"
     ]
     ]

+ 1 - 1
recipes/recipe_modules/git/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'recipe_engine/buildbucket',
   'recipe_engine/buildbucket',

+ 1 - 1
recipes/recipe_modules/git/tests/number.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'git',
     'git',

+ 1 - 1
recipes/recipe_modules/git_cl/__init__.py

@@ -1,4 +1,4 @@
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'recipe_engine/context',
     'recipe_engine/context',

+ 1 - 1
recipes/recipe_modules/gitiles/__init__.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'recipe_engine/json',
     'recipe_engine/json',

+ 4 - 13
recipes/recipe_modules/gitiles/api.py

@@ -2,15 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-from __future__ import division
-
 import base64
 import base64
-import sys
-
-try:
-  import urlparse
-except ImportError:  # pragma: no cover
-  import urllib.parse as urlparse
+import urllib.parse
 
 
 from recipe_engine import recipe_api
 from recipe_engine import recipe_api
 
 
@@ -161,10 +154,8 @@ class Gitiles(recipe_api.RecipeApi):
 
 
     value = base64.b64decode(step_result.json.output['value'])
     value = base64.b64decode(step_result.json.output['value'])
     try:
     try:
-      # TODO(crbug.com/1227140): Clean up when py2 is no longer supported.
       # If the file is not utf-8 encodable, return the bytes
       # If the file is not utf-8 encodable, return the bytes
-      if sys.version_info >= (3,):
-        value = value.decode('utf-8')
+      value = value.decode('utf-8')
     finally:
     finally:
       return value
       return value
 
 
@@ -240,9 +231,9 @@ class Gitiles(recipe_api.RecipeApi):
 
 
 def parse_http_host_and_path(url):
 def parse_http_host_and_path(url):
   # Copied from https://chromium.googlesource.com/infra/luci/recipes-py/+/809e57935211b3fcb802f74a7844d4f36eff6b87/recipe_modules/buildbucket/util.py
   # Copied from https://chromium.googlesource.com/infra/luci/recipes-py/+/809e57935211b3fcb802f74a7844d4f36eff6b87/recipe_modules/buildbucket/util.py
-  parsed = urlparse.urlparse(url)
+  parsed = urllib.parse.urlparse(url)
   if not parsed.scheme:
   if not parsed.scheme:
-    parsed = urlparse.urlparse('https://' + url)
+    parsed = urllib.parse.urlparse('https://' + url)
   if (parsed.scheme in ('http', 'https') and
   if (parsed.scheme in ('http', 'https') and
       not parsed.params and
       not parsed.params and
       not parsed.query and
       not parsed.query and

+ 1 - 1
recipes/recipe_modules/gitiles/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'gitiles',
     'gitiles',

+ 3 - 11
recipes/recipe_modules/gitiles/resources/gerrit_client.py

@@ -10,8 +10,6 @@ Example usage:
     -u https://chromium.googlesource.com/chromium/src/+log
     -u https://chromium.googlesource.com/chromium/src/+log
 """
 """
 
 
-from __future__ import print_function
-
 import argparse
 import argparse
 import json
 import json
 import logging
 import logging
@@ -19,13 +17,7 @@ import os
 import sys
 import sys
 import tarfile
 import tarfile
 import time
 import time
-
-try:
-  from urllib import urlencode
-  import urlparse
-except ImportError:  # pragma: no cover
-  from urllib.parse import urlencode
-  import urllib.parse as urlparse
+import urllib.parse
 
 
 DEPOT_TOOLS = os.path.abspath(
 DEPOT_TOOLS = os.path.abspath(
     os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir,
     os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir,
@@ -36,13 +28,13 @@ from gerrit_util import CreateHttpConn, ReadHttpResponse, ReadHttpJsonResponse
 
 
 
 
 def reparse_url(parsed_url, query_params):
 def reparse_url(parsed_url, query_params):
-  return urlparse.ParseResult(
+  return urllib.parse.ParseResult(
       scheme=parsed_url.scheme,
       scheme=parsed_url.scheme,
       netloc=parsed_url.netloc,
       netloc=parsed_url.netloc,
       path=parsed_url.path,
       path=parsed_url.path,
       params=parsed_url.params,
       params=parsed_url.params,
       fragment=parsed_url.fragment,
       fragment=parsed_url.fragment,
-      query=urlencode(query_params, doseq=True))
+      query=urllib.parse.urlencode(query_params, doseq=True))
 
 
 
 
 def gitiles_get(parsed_url, handler, attempts):
 def gitiles_get(parsed_url, handler, attempts):

+ 1 - 1
recipes/recipe_modules/gitiles/tests/parse_repo_url.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine.post_process import DropExpectation, StatusSuccess
 from recipe_engine.post_process import DropExpectation, StatusSuccess
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'gitiles',
   'gitiles',

+ 1 - 1
recipes/recipe_modules/gsutil/__init__.py

@@ -1,6 +1,6 @@
 from PB.recipe_modules.depot_tools.gsutil import properties
 from PB.recipe_modules.depot_tools.gsutil import properties
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'recipe_engine/context',
   'recipe_engine/context',

+ 1 - 1
recipes/recipe_modules/gsutil/examples/custom_boto.py

@@ -5,7 +5,7 @@
 from recipe_engine import post_process
 from recipe_engine import post_process
 from recipe_engine.recipe_api import Property
 from recipe_engine.recipe_api import Property
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'gsutil',
   'gsutil',

+ 1 - 1
recipes/recipe_modules/gsutil/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'gsutil',
   'gsutil',

+ 1 - 1
recipes/recipe_modules/osx_sdk/__init__.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'recipe_engine/cipd',
     'recipe_engine/cipd',

+ 1 - 1
recipes/recipe_modules/osx_sdk/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'osx_sdk',
   'osx_sdk',

+ 1 - 1
recipes/recipe_modules/presubmit/__init__.py

@@ -8,7 +8,7 @@ from recipe_engine.recipe_api import Property
 from PB.recipe_modules.depot_tools.presubmit import properties
 from PB.recipe_modules.depot_tools.presubmit import properties
 
 
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'bot_update',
   'bot_update',

+ 1 - 1
recipes/recipe_modules/presubmit/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'presubmit',
   'presubmit',

+ 1 - 1
recipes/recipe_modules/presubmit/tests/execute.py

@@ -7,7 +7,7 @@ import textwrap
 from recipe_engine import post_process
 from recipe_engine import post_process
 from recipe_engine import recipe_api
 from recipe_engine import recipe_api
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'gclient',
   'gclient',

+ 1 - 1
recipes/recipe_modules/presubmit/tests/prepare.py

@@ -6,7 +6,7 @@ from recipe_engine import post_process
 from recipe_engine import recipe_api
 from recipe_engine import recipe_api
 
 
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'gclient',
   'gclient',

+ 1 - 1
recipes/recipe_modules/tryserver/__init__.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'gerrit',
   'gerrit',

+ 1 - 1
recipes/recipe_modules/tryserver/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
   'gerrit',
   'gerrit',

+ 1 - 1
recipes/recipe_modules/tryserver/tests/gerrit_change_fetch_ref_timeout.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'gerrit',
     'gerrit',

+ 1 - 1
recipes/recipe_modules/tryserver/tests/gerrit_change_owner.py

@@ -5,7 +5,7 @@
 from recipe_engine.post_process import (DropExpectation, StatusSuccess,
 from recipe_engine.post_process import (DropExpectation, StatusSuccess,
                                         StepCommandContains)
                                         StepCommandContains)
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'gerrit',
     'gerrit',

+ 1 - 1
recipes/recipe_modules/tryserver/tests/gerrit_change_target_ref.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'gerrit',
     'gerrit',

+ 1 - 1
recipes/recipe_modules/tryserver/tests/get_change_description.py

@@ -5,7 +5,7 @@
 from recipe_engine.post_process import (DropExpectation, StatusSuccess, MustRun,
 from recipe_engine.post_process import (DropExpectation, StatusSuccess, MustRun,
                                         DoesNotRun)
                                         DoesNotRun)
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'tryserver',
     'tryserver',

+ 1 - 1
recipes/recipe_modules/tryserver/tests/get_files_affected_by_patch.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'tryserver',
     'tryserver',

+ 1 - 1
recipes/recipe_modules/tryserver/tests/get_footers.py

@@ -4,7 +4,7 @@
 
 
 from recipe_engine import post_process
 from recipe_engine import post_process
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'tryserver',
     'tryserver',

+ 1 - 1
recipes/recipe_modules/tryserver/tests/require_is_tryserver.py

@@ -7,7 +7,7 @@ from recipe_engine import post_process
 from PB.go.chromium.org.luci.swarming.proto.api import swarming as swarming_pb
 from PB.go.chromium.org.luci.swarming.proto.api import swarming as swarming_pb
 from PB.recipe_modules.recipe_engine.led import properties as led_properties_pb
 from PB.recipe_modules.recipe_engine.led import properties as led_properties_pb
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'tryserver',
     'tryserver',

+ 1 - 1
recipes/recipe_modules/windows_sdk/__init__.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'recipe_engine/cipd',
     'recipe_engine/cipd',

+ 1 - 1
recipes/recipe_modules/windows_sdk/examples/full.py

@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
 
 
-PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
 
 
 DEPS = [
 DEPS = [
     'windows_sdk',
     'windows_sdk',