Skip to content

Commit

Permalink
create entry points in virtual python environment
Browse files Browse the repository at this point in the history
  • Loading branch information
manfred-kaiser committed Mar 13, 2024
1 parent 90cface commit 1b08cd5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 22 deletions.
2 changes: 1 addition & 1 deletion appimage/startapp.py
Expand Up @@ -70,7 +70,7 @@ def __init__(self) -> None:
self.config.read(os.path.join(self.appdir, "appimage.ini"))

self.default_ep = self.config.get("appimage", "entry_point", fallback=None)
self.argv0 = os.environ.get("ARGV0")
self.argv0 = os.path.basename(os.environ.get("ARGV0"))
self.env_ep = os.environ.get("APP_ENTRY_POINT")
self.app_interpreter = os.environ.get("APP_INTERPRETER")

Expand Down
41 changes: 20 additions & 21 deletions sshmitm/commands/venv.py
Expand Up @@ -12,13 +12,9 @@
from types import SimpleNamespace


DEFAULT_CONFIG = """
[appimage]
entry_point =
"""
SYMLINK_TARGET = "python3"


def patch_appimage_venv(context: "SimpleNamespace") -> None:
def patch_appimage_venv(env_builder: EnvBuilder, context: "SimpleNamespace") -> None:
# if executed as AppImage override python symlink
# this is not relevant for extracted AppImages
appimage_path = os.environ.get("APPIMAGE")
Expand All @@ -27,30 +23,23 @@ def patch_appimage_venv(context: "SimpleNamespace") -> None:
sys.exit("venv command only supported by AppImages")

# replace symlink to appimage instead of python executable
python_path = os.path.join(context.bin_path, "python3")
python_path = os.path.join(context.bin_path, SYMLINK_TARGET)
os.remove(python_path)
os.symlink(appimage_path, python_path)

# create default command for application
config = ConfigParser()
config.read_string(DEFAULT_CONFIG)
if os.path.isfile(os.path.join(appdir, "appimage.ini")):
config.read(os.path.join(appdir, "appimage.ini"))
entry_point = config.get("appimage", "entry_point")
if not entry_point:
return

eps = entry_points()
scripts = eps.select(group="console_scripts") # type: ignore[attr-defined, unused-ignore] # ignore old python < 3.10
for ep in scripts:
if entry_point in (ep.name, ep.value):
os.symlink(python_path, os.path.join(context.bin_path, ep.name))
ep_path = os.path.join(context.bin_path, ep.name)
if os.path.isfile(ep_path):
continue
os.symlink(SYMLINK_TARGET, ep_path)


def setup_python_patched(self: EnvBuilder, context: "SimpleNamespace") -> None:
# call monkey patched function
self.setup_python_original(context) # type: ignore[attr-defined]
patch_appimage_venv(context)
patch_appimage_venv(self, context)


class SshMitmVenv(SubCommand):
Expand All @@ -59,16 +48,26 @@ class SshMitmVenv(SubCommand):
@classmethod
def config_section(cls) -> Optional[str]:
return None

def register_arguments(self) -> None:
self.parser.add_argument(
"dirs",
metavar="ENV_DIR",
nargs="+",
help="A directory to create the environment in.",
)
self.parser.add_argument(
"--without-pip",
dest="with_pip",
default=True,
action="store_false",
help="Skips installing or upgrading pip in the "
"virtual environment (pip is bootstrapped "
"by default)",
)

def execute(self, args: argparse.Namespace) -> None:
if os.environ.get("VIRTUAL_ENV"):
sys.exit("the 'env' command must not run in a virtual python environment!")
if not hasattr(EnvBuilder, "setup_python_original"):
# ignore type errors from monkey patching
EnvBuilder.setup_python_original = EnvBuilder.setup_python # type: ignore[attr-defined]
Expand All @@ -79,7 +78,7 @@ def execute(self, args: argparse.Namespace) -> None:
clear=False,
symlinks=True,
upgrade=False,
with_pip=False,
with_pip=args.with_pip,
prompt=None,
)
for d in args.dirs:
Expand Down

0 comments on commit 1b08cd5

Please sign in to comment.