@@ -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