Skip to content

Commit 2df8921

Browse files
Add support for retrieving raw file content from GitLab (#124)
* distro: introduce raw URL formatters Refactor GitHub formatting code and add GitLab formatter. * distro: add manifest download helper Return either cached version or attempt download and return result. * distro: download GitHub raw URL using helpers * distro: support GitLab hosted pkgs and manifests * Update GitHub Actions checkout and Pixi setup versions * Delete .github/workflows/enforce-sha.yml --------- Co-authored-by: Tobias Fischer <info@tobiasfischer.info>
1 parent 4d9015c commit 2df8921

3 files changed

Lines changed: 40 additions & 29 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ jobs:
1515
fail-fast: false
1616

1717
steps:
18-
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
18+
- uses: actions/checkout@v7
1919

2020
- name: Setup Pixi
21-
uses: prefix-dev/setup-pixi@28eb668aafebd9dede9d97c4ba1cd9989a4d0004 # v0.9.2
21+
uses: prefix-dev/setup-pixi@v0.10.0
2222
with:
2323
pixi-version: latest
2424
cache: true

.github/workflows/enforce-sha.yml

Lines changed: 0 additions & 17 deletions
This file was deleted.

vinca/distro.py

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,30 @@ def get_python_version(self):
187187
def get_package_names(self):
188188
return self._distro.release_packages.keys()
189189

190+
def get_package_xml_for_additional_package(self, pkg_info):
191+
raw_url_base = pkg_info.get("url")
192+
if "github.com" in raw_url_base:
193+
raw_url = self._construct_raw_url_github(pkg_info)
194+
return self._download_raw_pkg_xml_or_cached(url=raw_url)
195+
if "gitlab.com" in raw_url_base:
196+
raw_url = self._construct_raw_url_gitlab(pkg_info)
197+
return self._download_raw_pkg_xml_or_cached(url=raw_url)
198+
raise RuntimeError(f"Cannot handle unknown repository hoster: {raw_url_base}")
199+
200+
def _download_raw_pkg_xml_or_cached(self, url):
201+
if url in self._additional_xml_cache:
202+
return self._additional_xml_cache[url]
203+
try:
204+
with urllib.request.urlopen(url) as resp:
205+
xml_content = resp.read().decode("utf-8")
206+
self._additional_xml_cache[url] = xml_content
207+
return xml_content
208+
except Exception as e:
209+
raise RuntimeError(f"Failed to fetch package.xml from {url}: {e}")
210+
190211
# Based on https://github.com/ros-infrastructure/rosdistro/blob/fad8d9f647631945847cb18bc1d1f43008d7a282/src/rosdistro/manifest_provider/github.py#L51C1-L69C29
191212
# But with the option to specify the name of the package.xml file in case the repo uses a non-standard name
192-
def get_package_xml_for_additional_package(self, pkg_info):
213+
def _construct_raw_url_github(self, pkg_info):
193214
# Build raw GitHub URL for package.xml
194215
raw_url_base = pkg_info.get("url")
195216
if raw_url_base.endswith(".git"):
@@ -205,13 +226,20 @@ def get_package_xml_for_additional_package(self, pkg_info):
205226
if additional_folder != "":
206227
additional_folder = additional_folder + "/"
207228
raw_url = f"https://raw.githubusercontent.com/{owner_repo}/{ref}/{additional_folder}{xml_name}"
208-
if raw_url in self._additional_xml_cache:
209-
return self._additional_xml_cache[raw_url]
229+
return raw_url
210230

211-
try:
212-
with urllib.request.urlopen(raw_url) as resp:
213-
xml_content = resp.read().decode("utf-8")
214-
self._additional_xml_cache[raw_url] = xml_content
215-
return xml_content
216-
except Exception as e:
217-
raise RuntimeError(f"Failed to fetch package.xml from {raw_url}: {e}")
231+
# format (checked against GitLab 19.x): https://gitlab.com/<NAMESPACE>/-/raw/<REV>/<PATH>
232+
def _construct_raw_url_gitlab(self, pkg_info):
233+
raw_url_base = pkg_info.get("url")
234+
if raw_url_base.endswith(".git"):
235+
raw_url_base = raw_url_base[:-4]
236+
if "gitlab.com" not in raw_url_base:
237+
raise RuntimeError(f"Cannot handle non-GitLab URL: {raw_url_base}")
238+
# Use rev if available, otherwise fallback to tag
239+
ref = pkg_info.get("rev") or pkg_info.get("tag")
240+
xml_name = pkg_info.get("package_xml_name", "package.xml")
241+
additional_folder = pkg_info.get("additional_folder", "")
242+
if additional_folder != "":
243+
additional_folder = additional_folder + "/"
244+
raw_url = f"{raw_url_base}/-/raw/{ref}/{additional_folder}{xml_name}"
245+
return raw_url

0 commit comments

Comments
 (0)