Reland "Drop py2 support in recipe modules"

This is a reland of commit 5819c303f0

Original change's description:
> 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>

Bug: 1475402
Change-Id: Ie4e6612a95511026b7602837f8dd3030bcf3ef8a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/4811285
Reviewed-by: Josip Sokcevic <sokcevic@chromium.org>
Commit-Queue: Gavin Mak <gavinmak@google.com>
changes/85/4811285/4
Gavin Mak 2 years ago committed by LUCI CQ
parent 5146d78ee5
commit 642a989069

@ -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]
#### **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.
&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
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.
&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.
@ -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
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.
@ -208,7 +208,7 @@ Consults cfg.repo_path_map and fallbacks to urls in configured solutions.
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.
@ -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
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.
@ -226,9 +226,9 @@ Args:
override (bool) - If True, will forcibly set revision and custom_vars
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
changes.
@ -249,20 +249,20 @@ Returns:
commit hash.
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.
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.
&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)
[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]
#### **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.
&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.
@ -422,11 +422,11 @@ Args:
refs in the Git checkout will be bundled.
* 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.
&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.
@ -465,7 +465,7 @@ Args:
Returns: If the checkout was successful, this returns the commit hash of
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.
@ -475,7 +475,7 @@ Args:
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.
@ -488,11 +488,11 @@ Args:
Returns:
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.
&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.
@ -502,11 +502,11 @@ Args:
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.
&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
upload.
@ -518,7 +518,7 @@ Args:
* upstream_current (bool): whether to use '--upstream_current'.
* 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.
@ -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
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
@ -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]
#### **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.
&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.
&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.
@ -593,7 +593,7 @@ Args:
* step_name (str): If not None, override the step name.
* 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`.
@ -609,7 +609,7 @@ Args:
* revision (str): The ref or revision in the repo to download. Defaults to
'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.
@ -623,7 +623,7 @@ Args:
Returns:
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.
@ -646,17 +646,17 @@ Returns:
Cursor can be used for subsequent calls to log for paging. If None,
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 (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.
&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.
### *recipe_modules* / [gsutil](/recipes/recipe_modules/gsutil)

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

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

@ -5,9 +5,6 @@
# TODO(hinoka): Use logging.
from __future__ import division
from __future__ import print_function
import codecs
from contextlib import contextmanager
import copy
@ -28,18 +25,8 @@ import uuid
import os.path as path
# TODO(crbug.com/1227140): Clean up when py2 is no longer supported.
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.
BUF_SIZE = 256
@ -169,13 +156,6 @@ def _kill_process(proc):
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
"""Interactive subprocess call."""
@ -235,10 +215,10 @@ def call(*args, **kwargs): # pragma: no cover
if hanging_cr:
buf = buf[:-1]
buf = buf.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
_stdout_write(buf)
sys.stdout.buffer.write(buf)
out.write(buf)
if hanging_cr:
_stdout_write(b'\n')
sys.stdout.buffer.write(b'\n')
out.write(b'\n')
code = proc.wait()
@ -331,7 +311,7 @@ def modify_solutions(input_solutions):
solutions = copy.deepcopy(input_solutions)
for solution in solutions:
original_url = solution['url']
parsed_url = urlparse.urlparse(original_url)
parsed_url = urlparse(original_url)
parsed_path = parsed_url.path
solution['managed'] = False
@ -478,7 +458,7 @@ def normalize_git_url(url):
* Do not contain /a/ in their path.
"""
try:
p = urlparse.urlparse(url)
p = urlparse(url)
except Exception:
# Not a url, just return it back.
return url
@ -893,7 +873,7 @@ def parse_revisions(revisions, root):
# This is an alt_root@revision argument.
current_root, current_rev = split_revision
parsed_root = urlparse.urlparse(current_root)
parsed_root = urlparse(current_root)
if parsed_root.scheme in ['http', 'https']:
# We want to normalize git urls into .git urls.
normalized_root = 'https://' + parsed_root.netloc + parsed_root.path

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

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

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

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

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

@ -4,12 +4,6 @@
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
class DepsDiffException(Exception):
@ -68,7 +62,7 @@ def jsonish_to_python(spec, is_top=False):
ret += '['
ret += ', '.join(jsonish_to_python(x) for x in spec)
ret += ']'
elif isinstance(spec, _STRING_TYPE):
elif isinstance(spec, str):
ret = repr(str(spec))
else:
ret = repr(spec)

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

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

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

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

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

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

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

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

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

@ -2,17 +2,9 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import division
import itertools
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 util as recipe_util
@ -61,8 +53,7 @@ class GitApi(recipe_api.RecipeApi):
"""
if previous_result:
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-pack' in previous_result

@ -184,7 +184,7 @@
"Traceback (most recent call last):",
" 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",
" 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')",
"ValueError('Can not define both upstream and upstream_current')"
]

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

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

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

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

@ -2,15 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import division
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
@ -161,10 +154,8 @@ class Gitiles(recipe_api.RecipeApi):
value = base64.b64decode(step_result.json.output['value'])
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 sys.version_info >= (3,):
value = value.decode('utf-8')
value = value.decode('utf-8')
finally:
return value
@ -240,9 +231,9 @@ class Gitiles(recipe_api.RecipeApi):
def parse_http_host_and_path(url):
# 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:
parsed = urlparse.urlparse('https://' + url)
parsed = urllib.parse.urlparse('https://' + url)
if (parsed.scheme in ('http', 'https') and
not parsed.params and
not parsed.query and

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

@ -10,8 +10,6 @@ Example usage:
-u https://chromium.googlesource.com/chromium/src/+log
"""
from __future__ import print_function
import argparse
import json
import logging
@ -19,13 +17,7 @@ import os
import sys
import tarfile
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(
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):
return urlparse.ParseResult(
return urllib.parse.ParseResult(
scheme=parsed_url.scheme,
netloc=parsed_url.netloc,
path=parsed_url.path,
params=parsed_url.params,
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):
@ -118,13 +110,13 @@ def main(arguments):
args.extract_to = os.path.join(os.path.abspath(args.extract_to), '')
os.makedirs(args.extract_to)
parsed_url = urlparse.urlparse(args.url)
parsed_url = urllib.parse.urlparse(args.url)
if not parsed_url.scheme.startswith('http'):
parser.error('Invalid URI scheme (expected http or https): %s' % args.url)
query_params = {}
if parsed_url.query:
query_params.update(urlparse.parse_qs(parsed_url.query))
query_params.update(urllib.parse.parse_qs(parsed_url.query))
# Force the format specified on command-line.
if query_params.get('format'):
parser.error('URL must not contain format; use --format command line flag '

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -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.recipe_modules.recipe_engine.led import properties as led_properties_pb
PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
PYTHON_VERSION_COMPATIBILITY = 'PY3'
DEPS = [
'tryserver',

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

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

Loading…
Cancel
Save