Skip to content

Commit 35f0963

Browse files
Merge pull request #59 from JaydenGrubb1/snapshots
Add snapshot system
2 parents c47948c + 003c0e7 commit 35f0963

File tree

4 files changed

+118
-24
lines changed

4 files changed

+118
-24
lines changed

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ console_scripts =
4242
vinca-gha = vinca.generate_gha:main
4343
vinca-azure = vinca.generate_azure:main
4444
vinca-migrate = vinca.migrate:main
45+
vinca-snapshot = vinca.snapshot:main
4546

4647
[flake8]
4748
import-order-style = google

vinca/distro.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77

88
class Distro(object):
9-
def __init__(self, distro_name, python_version=None):
9+
def __init__(self, distro_name, python_version=None, snapshot=None):
1010
index = get_index(get_index_url())
1111
self._distro = get_cached_distribution(index, distro_name)
1212
self.distro_name = distro_name
13+
self.snapshot = snapshot
1314
# set up ROS environments
1415
if python_version is None:
1516
python_version = index.distributions[distro_name]["python_version"]
@@ -60,20 +61,29 @@ def get_depends(self, pkg, ignore_pkgs=None):
6061
return dependencies
6162

6263
def get_released_repo(self, pkg_name):
64+
if self.snapshot and pkg_name in self.snapshot:
65+
return (
66+
self.snapshot[pkg_name].get("url", None),
67+
self.snapshot[pkg_name].get("tag", None),
68+
)
69+
6370
pkg = self._distro.release_packages[pkg_name]
6471
repo = self._distro.repositories[pkg.repository_name].release_repository
6572
release_tag = get_release_tag(repo, pkg_name)
6673
return repo.url, release_tag
6774

6875
def check_package(self, pkg_name):
6976
if pkg_name in self._distro.release_packages:
70-
return True
77+
return self.snapshot is None or pkg_name in self.snapshot
7178
elif pkg_name in self.build_packages:
7279
return True
7380
else:
7481
return False
7582

7683
def get_version(self, pkg_name):
84+
if self.snapshot and pkg_name in self.snapshot:
85+
return self.snapshot[pkg_name].get("version", None)
86+
7787
pkg = self._distro.release_packages[pkg_name]
7888
repo = self._distro.repositories[pkg.repository_name].release_repository
7989
return repo.version.split("-")[0]
@@ -86,3 +96,6 @@ def check_ros1(self):
8696

8797
def get_python_version(self):
8898
return self._python_version
99+
100+
def get_package_names(self):
101+
return self._distro.release_packages.keys()

vinca/main.py

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ def parse_command_line(argv):
126126
default=None,
127127
help="The conda platform to check existing recipes for.",
128128
)
129+
parser.add_argument(
130+
"-z",
131+
"--snapshot",
132+
dest="snapshot",
133+
default=None,
134+
help="The version snapshot file (default: None)."
135+
)
129136
arguments = parser.parse_args(argv[1:])
130137
global selected_platform
131138
config.parsed_args = arguments
@@ -214,6 +221,15 @@ def read_vinca_yaml(filepath):
214221
return vinca_conf
215222

216223

224+
def read_snapshot(filepath):
225+
if not filepath:
226+
return None
227+
228+
yaml = ruamel.yaml.YAML()
229+
snapshot = yaml.load(open(filepath, "r"))
230+
return snapshot
231+
232+
217233
def generate_output(pkg_shortname, vinca_conf, distro, version, all_pkgs=None):
218234
if not all_pkgs:
219235
all_pkgs = []
@@ -286,6 +302,7 @@ def generate_output(pkg_shortname, vinca_conf, distro, version, all_pkgs=None):
286302
resolved_setuptools = resolve_pkgname("python-setuptools", vinca_conf, distro)
287303
output["requirements"]["host"].extend(resolved_setuptools)
288304
else:
305+
print(f"Unknown build type for {pkg_shortname}: {pkg.get_build_type()}")
289306
return None
290307

291308
if vinca_conf.get("mutex_package"):
@@ -511,21 +528,14 @@ def get_pkg(pkg_name):
511528
return outputs
512529

513530

514-
def get_version(distro, vinca_conf, pkg_shortname):
515-
version = distro.get_version(pkg_shortname)
516-
if (
517-
vinca_conf.get("package_version")
518-
and vinca_conf["package_version"][pkg_shortname]
519-
):
520-
version = vinca_conf["package_version"][pkg_shortname]["version"]
521-
522-
return version
523-
524-
525531
def generate_outputs_version(distro, vinca_conf):
526532
outputs = []
527533
for pkg_shortname in vinca_conf["_selected_pkgs"]:
528-
version = get_version(distro, vinca_conf, pkg_shortname)
534+
if not distro.check_package(pkg_shortname):
535+
print(f"Could not generate output for {pkg_shortname}")
536+
continue
537+
538+
version = distro.get_version(pkg_shortname)
529539
output = generate_output(pkg_shortname, vinca_conf, distro, version)
530540
if output is not None:
531541
outputs.append(output)
@@ -545,7 +555,7 @@ def generate_source(distro, vinca_conf):
545555
entry["git"] = url
546556
entry["tag"] = version
547557
pkg_names = resolve_pkgname(pkg_shortname, vinca_conf, distro)
548-
pkg_version = get_version(distro, vinca_conf, pkg_shortname)
558+
pkg_version = distro.get_version(pkg_shortname)
549559
print("Checking ", pkg_shortname, pkg_version)
550560
if not pkg_names:
551561
continue
@@ -585,12 +595,6 @@ def generate_source_version(distro, vinca_conf):
585595
continue
586596

587597
url, version = distro.get_released_repo(pkg_shortname)
588-
if (
589-
vinca_conf["package_version"]
590-
and vinca_conf["package_version"][pkg_shortname]
591-
):
592-
url = vinca_conf["package_version"][pkg_shortname]["url"]
593-
version = vinca_conf["package_version"][pkg_shortname]["version"]
594598

595599
entry = {}
596600
entry["git"] = url
@@ -860,6 +864,7 @@ def main():
860864
base_dir = os.path.abspath(arguments.dir)
861865
vinca_yaml = os.path.join(base_dir, "vinca.yaml")
862866
vinca_conf = read_vinca_yaml(vinca_yaml)
867+
snapshot = read_snapshot(arguments.snapshot)
863868

864869
from .template import generate_bld_ament_cmake
865870
from .template import generate_bld_ament_python
@@ -878,7 +883,7 @@ def main():
878883
if arguments.trigger_new_versions:
879884
vinca_conf["trigger_new_versions"] = True
880885
else:
881-
vinca_conf["trigger_new_versions"] = False
886+
vinca_conf["trigger_new_versions"] = vinca_conf.get("trigger_new_versions", False)
882887

883888
if arguments.package:
884889
pkg_files = glob.glob(arguments.package)
@@ -887,7 +892,7 @@ def main():
887892
if "python_version" in vinca_conf:
888893
python_version = vinca_conf["python_version"]
889894

890-
distro = Distro(vinca_conf["ros_distro"], python_version)
895+
distro = Distro(vinca_conf["ros_distro"], python_version, snapshot)
891896
additional_pkgs, parsed_pkgs = [], []
892897
for f in pkg_files:
893898
parsed_pkg = catkin_pkg.package.parse_package(f)
@@ -992,7 +997,7 @@ def main():
992997
if "python_version" in vinca_conf:
993998
python_version = vinca_conf["python_version"]
994999

995-
distro = Distro(vinca_conf["ros_distro"], python_version)
1000+
distro = Distro(vinca_conf["ros_distro"], python_version, snapshot)
9961001

9971002
selected_pkgs = get_selected_packages(distro, vinca_conf)
9981003

vinca/snapshot.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import argparse
2+
import yaml
3+
from .distro import Distro
4+
5+
6+
def main():
7+
parser = argparse.ArgumentParser(
8+
description="Dependency snapshotting tool for ROS packages"
9+
)
10+
parser.add_argument(
11+
"-d",
12+
"--distro",
13+
type=str,
14+
dest="distro",
15+
default="humble",
16+
help="ROS distribution to use (default: humble)",
17+
required=False,
18+
)
19+
parser.add_argument(
20+
"-p",
21+
"--package",
22+
type=str,
23+
dest="package",
24+
default=None,
25+
help="ROS package to get dependencies for (default: ALL)",
26+
required=False,
27+
)
28+
parser.add_argument(
29+
"-o",
30+
"--output",
31+
type=str,
32+
dest="output",
33+
default="snapshot.yaml",
34+
help="Output file to write dependencies to",
35+
required=False,
36+
)
37+
parser.add_argument(
38+
"-q",
39+
"--quiet",
40+
dest="quiet",
41+
action="store_true",
42+
help="Suppress output to stdout",
43+
required=False,
44+
)
45+
args = parser.parse_args()
46+
47+
distro = Distro(args.distro)
48+
49+
if args.package is None:
50+
deps = distro.get_package_names()
51+
else:
52+
deps = distro.get_depends(args.package)
53+
deps.add(args.package)
54+
55+
if not args.quiet:
56+
max_len = max([len(dep) for dep in deps])
57+
print("\033[1m{0:{2}} {1}\033[0m".format("Package", "Version", max_len + 2))
58+
59+
output = {}
60+
61+
for dep in deps:
62+
try:
63+
url, tag = distro.get_released_repo(dep)
64+
version = distro.get_version(dep)
65+
except AttributeError:
66+
print("\033[93mPackage '{}' has no version set, skipping...\033[0m".format(dep))
67+
continue
68+
69+
output[dep] = {"url": url, "version": version, "tag": tag}
70+
71+
if not args.quiet:
72+
print("{0:{2}} {1}".format(dep, version, max_len + 2))
73+
74+
with open(args.output, "w") as f:
75+
yaml.dump(output, f)

0 commit comments

Comments
 (0)