Fix data file path detection with new pip

Using an editable installation of Kayobe fails on Rocky Linux 9 or
Ubuntu with an error such as:

    ERROR! The requirements file '/home/rocky/kayobe/kayobe/requirements.yml' does not exist.
    Failed to install Ansible roles from /home/rocky/kayobe/kayobe/utils.py/../requirements.yml via Ansible Galaxy: returncode 1
    Control host bootstrap failed - likely Ansible Galaxy flakiness. Sleeping 5 seconds before retrying

This is caused by recent changes to how pip manages editable
installations. The egg-link file that Kayobe was using to find the
source path does not exist anymore. Instead, there is a direct_url.json
file under the kayobe dist-info directory that can be parsed.

Change-Id: I9dd5b97dec93c0e5393a1e7d9640f85003651b56
Closes-Bug: #2020135
This commit is contained in:
Pierre Riteau 2023-09-21 18:29:23 +02:00
parent 3089774cf3
commit 1847ad3f17
2 changed files with 27 additions and 0 deletions

View File

@ -16,6 +16,8 @@ import base64
from collections import defaultdict
import glob
import graphlib
import importlib_metadata
import json
import logging
import os
import shutil
@ -50,10 +52,30 @@ def _detect_install_prefix(path):
return prefix_path
def _get_direct_url(dist):
direct_url = os.path.join(dist._path, 'direct_url.json')
if os.path.exists(direct_url):
with open(direct_url, 'r') as f:
direct_url_content = json.loads(f.readline().strip())
url = direct_url_content['url']
prefix = 'file://'
if url.startswith(prefix):
return url[len(prefix):]
return None
def _get_base_path():
override = os.environ.get("KAYOBE_DATA_FILES_PATH")
if override:
return os.path.join(override)
kayobe_dist = list(importlib_metadata.Distribution.discover(name="kayobe"))
if kayobe_dist:
direct_url = _get_direct_url(kayobe_dist[0])
if direct_url:
return direct_url
egg_glob = os.path.join(
sys.prefix, 'lib*', 'python*', '*-packages', 'kayobe.egg-link'
)

View File

@ -0,0 +1,5 @@
---
fixes:
- |
Fixes detection of data file path when using editable installations with a
recent pip.