aboutsummaryrefslogtreecommitdiff
path: root/tests/rpm/rpm_util.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/rpm/rpm_util.py')
-rw-r--r--tests/rpm/rpm_util.py130
1 files changed, 0 insertions, 130 deletions
diff --git a/tests/rpm/rpm_util.py b/tests/rpm/rpm_util.py
deleted file mode 100644
index 5655fc5..0000000
--- a/tests/rpm/rpm_util.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright 2021 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import io
-import csv
-import subprocess
-
-
-def get_rpm_version_as_tuple(rpm_bin_path="rpm"):
- """Get the current version of the requested rpm(8) binary."""
- output = subprocess.check_output(
- [rpm_bin_path, "--version"]).decode('utf-8')
-
- # e.g. RPM Version 4.13.1
- version_str = output.split()[2]
-
- return tuple(int(component) for component in version_str.split('.'))
-
-
-def invoke_rpm_with_queryformat(rpm_file_path, queryformat, rpm_bin_path="rpm"):
- """Helper to ease the invocation of an rpm query with a custom queryformat.
-
- Returns any output as a UTF-8 decoded string if the command succeeds. If it
- fails, throws CalledProcessException, like `subprocess.check_output`.
- """
-
- # The RPM tooling (at least the copy I have here, 4.14.2.1) is a bit buggy:
- #
- # - If you don't pass "-p/--package" argument, `rpm -q --queryformat` run
- # against a package will always "fail" with no explanation.
- #
- # - If you do pass "-p/--package" argument, `rpm -q --queryformat` run
- # against a package will always succeed if it can read a file, even when
- # there is an error in some other aspect of the query.
- #
- # As a workaround, you should generally know if you're expecting output.
- # Check if the output contains anything not whitespace, or if you're using
- # `read_rpm_filedata`, check if the output dict is nonempty.
- return subprocess.check_output([rpm_bin_path, "-qp", "--queryformat", queryformat, rpm_file_path]).decode("utf-8")
-
-
-# TODO(nacl): "rpm_bin_path" should be derived from a toolchain somewhere.
-#
-# At this time, the "Rpmbuild" toolchain only contains rpmbuild. Since `rpm`
-# itself is only useful for tests, this may be overkill.
-def read_rpm_filedata(rpm_file_path, rpm_bin_path="rpm", query_tag_map=None):
- """Read rpm file-based metadata into a dictionary
-
- Keys are the file names (absolute paths), values are the metadata as another
- dictionary.
-
- The metadata fields are those defined in an RPM query, and is a map of query
- tags to simple variable names. The fields must be plural, as identified by
- the names. Some examples are in the default argument, described below.
-
- - FILENAMES -> path (file absolute path)
- - FILEDIGESTS -> digest (hash of file. MD5 for compatibility)
- - FILEUSERNAME -> user (UNIX owning user)
- - FILEGROUPNAME -> group (UNIX owning group)
- - FILEMODES:octal -> mode (UNIX mode, as an octal string)
- - FILEFLAGS:fflags -> fflags (RPM file flags as a string, see upstream documentation)
- - FILELINKTOS -> Symlink target, or nothing (something "falsy") if not provided
-
- Check out the implementation for more details, and consult the RPM
- documentation even more more details. You can get a list of all tags by
- invoking `rpm --querytags`.
-
- NOTE: see also caveats in `invoke_rpm_with_queryformat`, above.
-
- """
- # It is not necessary to check for file sizes, as the hashes are
- # sufficient for determining whether or not files are the same.
- #
- # This also simplifies behavior where RPM's size calculations have
- # sometimes changed, e.g.:
- #
- # https://github.com/rpm-software-management/rpm/commit/2cf7096ba534b065feb038306c792784458ac9c7
-
- if query_tag_map is None:
- rpm_queryformat = (
- "[%{FILENAMES}"
- ",%{FILEDIGESTS}"
- ",%{FILEUSERNAME}"
- ",%{FILEGROUPNAME}"
- ",%{FILEMODES:octal}"
- ",%{FILEFLAGS:fflags}"
- ",%{FILELINKTOS}"
- "\n]"
- )
- rpm_queryformat_fieldnames = [
- "path",
- "digest",
- "user",
- "group",
- "mode",
- "fflags",
- "symlink",
- ]
- else:
- rpm_queryformat = "["
- rpm_queryformat += ",".join(["%{{{}}}".format(query_tag)
- for query_tag in query_tag_map.keys()])
- rpm_queryformat += "\n]"
-
- rpm_queryformat_fieldnames = list(query_tag_map.values())
-
- rpm_output = invoke_rpm_with_queryformat(
- rpm_file_path,
- rpm_queryformat,
- rpm_bin_path,
- )
-
- sio = io.StringIO(rpm_output)
- rpm_output_reader = csv.DictReader(
- sio,
- fieldnames=rpm_queryformat_fieldnames
- )
-
- return {r['path']: r for r in rpm_output_reader}