Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

__package_pip: Fall back to __object_id if the package name can't be deduced from --requirement #46

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 36 additions & 6 deletions type/__package_pip/explorer/state
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,41 @@ test -n "${pyinterp}" || {
}

# Execute the matching Python interpreter of pip.
pip_python() { eval set -- "${pyinterp}" '"$@"'; "$@"; }
# shellcheck disable=SC2120
pip_python() { eval "set -- \"${pyinterp}\" \"\$@"\"; "$@"; }

requirement=$("${__type_explorer:?}/requirement")
REQUIREMENT=$("${__type_explorer:?}/requirement")
export REQUIREMENT

pip_python -c '__import__("pkg_resources").require(__import__("sys").argv[1])' \
"${requirement}" >/dev/null 2>&1 \
&& echo present \
|| echo absent
pip_python <<CODE
import pkg_resources
import os
import sys


def check_requirement(r):
try:
pkg_resources.require(requirement)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note to self: incorrect variable name.

return "present"
except pkg_resources.DistributionNotFound:
return "absent"


def println(line, file):
file.write(line + "\n")


requirement = os.environ["REQUIREMENT"]

try:
println(check_requirement(requirement), sys.stdout)
except pkg_resources.RequirementParseError:
# requirement is probably an URL, fall back to __object_id
requirement = os.environ["__object_id"]
println(check_requirement(requirement), sys.stdout)

except pkg_resources.UnknownExtra as e:
# unknown extras are not acceptable
println(str(e), sys.stderr)
sys.exit(1)
CODE
12 changes: 11 additions & 1 deletion type/__package_pip/man.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ Most OSes provide a package to get a default pip installation, so it's usually
sufficient to add ``__package python3-pip`` to your manifest.


**Caveat:** This type can only do proper state detection if the
``--requirement`` is the name of a package in the PyPI index.
If it is a URL, this type can only check if the package is already install but
not e.g. switch a Git branch, because the installed branch is not tracked by the
package manager.
Furthermore, if a URL does not start with ``[packagename]@``, the type will fall
back to assume the ``__object_id`` contains the package name what would be
installed by the given ``--requirement``.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's move this section to requirement parameter section?



REQUIRED PARAMETERS
-------------------
None
Expand Down Expand Up @@ -82,7 +92,7 @@ EXAMPLES
__package_pip mautrix-telegram --requirement mautrix-telegram[all]

# Install package from URL
__package_pip mkosi --requirement git+https://github.com/systemd/mkosi.git
__package_pip mkosi --requirement mkosi@git+https://github.com/systemd/mkosi.git


SEE ALSO
Expand Down