From 8c76e2dd0764518612b74434a0d2c425e8c60b87 Mon Sep 17 00:00:00 2001
From: Michael Scarito
Date: Tue, 21 Jan 2020 17:13:53 -0800
Subject: [PATCH 1/2] Add option to pass extra args to pip from pip_import.
Adds the attr extra_pip_args to pip_import. These args will be passed
along to the pip invocation inside piptool.
---
packaging/piptool.py | 8 +++++++-
python/pip.bzl | 16 +++++++++++++---
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/packaging/piptool.py b/packaging/piptool.py
index 766a6742fd..ffae941064 100644
--- a/packaging/piptool.py
+++ b/packaging/piptool.py
@@ -102,6 +102,9 @@ def pip_main(argv):
parser.add_argument('--directory', action='store',
help=('The directory into which to put .whl files.'))
+parser.add_argument('--extra_pip_args', action='store',
+ help=('Extra arguments to pass down to pip.'))
+
def determine_possible_extras(whls):
"""Determines the list of possible "extras" for each .whl
@@ -160,7 +163,10 @@ def main():
args = parser.parse_args()
# https://github.com/pypa/pip/blob/9.0.1/pip/__init__.py#L209
- if pip_main(["wheel", "-w", args.directory, "-r", args.input]):
+ pip_args = ["wheel", "-w", args.directory, "-r", args.input]
+ if args.extra_pip_args:
+ pip_args += args.extra_pip_args.strip("\"").split()
+ if pip_main(pip_args):
sys.exit(1)
# Enumerate the .whl files we downloaded.
diff --git a/python/pip.bzl b/python/pip.bzl
index 37da2a2cac..cae023f646 100644
--- a/python/pip.bzl
+++ b/python/pip.bzl
@@ -22,8 +22,7 @@ def _pip_import_impl(repository_ctx):
# requirements.bzl without it.
repository_ctx.file("BUILD", "")
- # To see the output, pass: quiet=False
- result = repository_ctx.execute([
+ args = [
repository_ctx.attr.python_interpreter,
repository_ctx.path(repository_ctx.attr._script),
"--python_interpreter",
@@ -36,13 +35,24 @@ def _pip_import_impl(repository_ctx):
repository_ctx.path("requirements.bzl"),
"--directory",
repository_ctx.path(""),
- ])
+ ]
+ if repository_ctx.attr.extra_pip_args:
+ args += [
+ "--extra_pip_args",
+ "\"" + " ".join(repository_ctx.attr.extra_pip_args) + "\"",
+ ]
+
+ # To see the output, pass: quiet=False
+ result = repository_ctx.execute(args)
if result.return_code:
fail("pip_import failed: %s (%s)" % (result.stdout, result.stderr))
pip_import = repository_rule(
attrs = {
+ "extra_pip_args": attr.string_list(
+ doc = "Extra arguments to pass on to pip. Must not contain spaces.",
+ ),
"python_interpreter": attr.string(default = "python", doc = """
The command to run the Python interpreter used to invoke pip and unpack the
wheels.
From 442263e07a6b340d3933a377c618ab3600756224 Mon Sep 17 00:00:00 2001
From: Jon Brandvein
Date: Fri, 21 Feb 2020 14:50:08 -0500
Subject: [PATCH 2/2] Regenerate tools and docs
---
docs/pip.md | 11 ++++++++++-
tools/piptool.par | Bin 5901310 -> 5901770 bytes
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/docs/pip.md b/docs/pip.md
index 037bdfa90b..73035fdfef 100755
--- a/docs/pip.md
+++ b/docs/pip.md
@@ -5,7 +5,7 @@
## pip_import
-pip_import(name, python_interpreter, requirements)
+pip_import(name, extra_pip_args, python_interpreter, requirements)
A rule for importing `requirements.txt` dependencies into Bazel.
@@ -67,6 +67,15 @@ py_binary(
+
python_interpreter |
diff --git a/tools/piptool.par b/tools/piptool.par
index 57ef98d14edfea0ef26c6693512d4af12f5442a3..2fa8909d0abbb392b0d57b4ff38064f4418b4b86 100755
GIT binary patch
delta 8859
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
delta 8138
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
|