Skip to content

Instantly share code, notes, and snippets.

@furushchev
Last active November 1, 2024 03:17
Show Gist options
  • Save furushchev/a8d126aed8f160379665cafe632b74e1 to your computer and use it in GitHub Desktop.
Save furushchev/a8d126aed8f160379665cafe632b74e1 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import argparse
import subprocess
import sys
import requests
import yaml
def get_noetic_repos(targets, excludes=None):
cmd = [
'rosinstall_generator',
'--rosdistro', 'noetic',
'--upstream',
'--deps',
'--format', 'repos',
*targets,
]
if excludes:
cmd += ['--exclude', *excludes]
rosinstall_generator = subprocess.run(cmd, check=True, capture_output=True)
repos = yaml.safe_load(rosinstall_generator.stdout)
return repos['repositories']
def get_obese_repos(allowed_list=None):
all_data = []
page = 0
while True:
response = requests.get(
url='https://api.github.com/orgs/ros-o/repos',
params={
'per_page': 100,
'page': page,
},
headers={
'Accept': 'application/vnd.github+json',
'X-GitHub-Api-Version': '2022-11-28',
})
response.raise_for_status()
if data := response.json():
all_data += data
page += 1
else:
break
repositories = {}
for entry in all_data:
name = entry['name']
if allowed_list and name not in allowed_list:
continue
repositories[entry['name']] = {
'type': 'git',
'url': entry['clone_url'],
'version': entry['default_branch'],
}
return repositories
def main():
p = argparse.ArgumentParser()
p.add_argument('--output', type=str, default='-')
# NOTE:
# As of 2024/10/30, some dependencies of four_wheel_steering_controller are not listed
# in the desktop_full, including four_wheel_steering_msgs, urdf_geometry_parser.
# We need to set four_wheel_steering_controller explicitly.
p.add_argument('--target', type=str, nargs='+',
default=['desktop_full', 'four_wheel_steering_controller'])
p.add_argument('--exclude', type=str, nargs='*',
default=['stage', 'stage_ros'])
args = p.parse_args()
noetic_repos = get_noetic_repos(args.target, args.exclude)
obese_repos = get_obese_repos(allowed_list=noetic_repos)
repos = noetic_repos.copy()
repos.update(obese_repos)
if args.output == '-':
stream = sys.stdout
else:
stream = open(args.output, 'w')
yaml.safe_dump({'repositories': repos}, stream)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment