From e834019e8d3e4a117f0078d1e53d1aae4ec5e893 Mon Sep 17 00:00:00 2001 From: jkunstle Date: Aug 09 2021 18:13:42 +0000 Subject: Added 'x-pkg verrel' for containers Users wanted the ability to use 'x-pkg verrel' to get relevant information about their container images. Method parses values in Dockerfile. There are two rules for parsing values from Dockerfile correctly. (1) _VERSION supercedes VERSION (2) If there are no VERSION values or no RELEASE value, 'verrel' fails on Dockerfile. + added changes suggested by @onosek Fixes: #547 Jira: RHELCMP-4751 Signed-off-by: jkunstle --- diff --git a/.gitignore b/.gitignore index d7bd4c8..91d99c7 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ tags htmlcov/ /.eggs/ .env/ +.venv/ doc/build/ doc/source/_static diff --git a/pyrpkg/__init__.py b/pyrpkg/__init__.py index 142df55..01eb927 100644 --- a/pyrpkg/__init__.py +++ b/pyrpkg/__init__.py @@ -665,10 +665,24 @@ class Commands(object): def load_nameverrel(self): """Set the release of a package.""" + # If the repo is a container, we check for 'verrel' information in the Dockerfile. + if self.ns in ("container", "containers"): + if os.path.isfile(os.path.join(self.layout.root_dir, "Dockerfile")): + docker_name, docker_version, docker_release = self.load_nameverrel_dockerfile() + + self._package_name_spec = docker_name + self._epoch = "0" + self._ver = docker_version + self._rel = docker_release + return + else: + raise rpkgError("Dockerfile for {0} not found.".format(self.repo_name)) + + # Otherwise, we get 'verrel' information from the '.spec' file. cmd = ['rpm'] cmd.extend(self.rpmdefines) - specfile_path = os.path.join(self.path, self.spec) + specfile_path = os.path.join(self.layout.specdir, self.spec) if specfile_uses_rpmautospec: self._uses_autorelease = specfile_uses_rpmautospec( @@ -706,7 +720,7 @@ class Commands(object): self.log.error(err) if proc.returncode > 0: raise rpkgError('Could not get n-v-r-e from %s' - % os.path.join(self.path, self.spec)) + % os.path.join(self.layout.specdir, self.spec)) # Get just the output, then split it by ??, grab the first and split # again to get ver and rel @@ -4090,3 +4104,34 @@ class Commands(object): if ret == 0: self.log.info("Remote '{}' for '{}' was added.".format(remote_name, anongiturl)) self._run_command(['git', 'fetch', remote_name]) + + def load_nameverrel_dockerfile(self): + + named_version_pattern = re.compile(r"{0}_VERSION\s?=\s?([0-9.]+)".format(self.repo_name), + re.IGNORECASE) + version_pattern = re.compile(r"\bVERSION\b\s?=\s?([0-9.]+)", re.IGNORECASE) + release_pattern = re.compile(r"\bRELEASE\b\s?=\s?([0-9.]+)", re.IGNORECASE) + + with open(os.path.join(self.layout.root_dir, "Dockerfile"), "r") as f: + text = str(f.read()) + + named_version_match = re.search(named_version_pattern, text) + version_match = re.search(version_pattern, text) + release_match = re.search(release_pattern, text) + + if named_version_match: + version = named_version_match.group(1) + else: + if version_match: + version = version_match.group(1) + else: + raise rpkgError('Could not query n-v-r of %s: no version in Dockerfile.' + % (self.repo_name)) + + if release_match: + release = release_match.group(1) + else: + raise rpkgError('Could not query n-v-r of %s: no release value in Dockerfile.' + % (self.repo_name)) + + return self._repo_name, version, release diff --git a/pyrpkg/cli.py b/pyrpkg/cli.py index 3b4615c..6aa8f27 100644 --- a/pyrpkg/cli.py +++ b/pyrpkg/cli.py @@ -1545,7 +1545,7 @@ class cliClient(object): def register_verrel(self): verrel_parser = self.subparsers.add_parser( - 'verrel', help='Print the name-version-release') + 'verrel', help='Print the name-version-release.') verrel_parser.set_defaults(command=self.verrel) def register_container_build_common(self):