Skip to content

Commit 0259346

Browse files
Add rpm content compare
1 parent 079e285 commit 0259346

1 file changed

Lines changed: 61 additions & 28 deletions

File tree

configuration/steps/commands/scripts/srpm_compare.sh

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ DIR_REBUILT=$2 # Directory containing rebuilt rpms
66
EXCLUDE_RPMS=$3 # Comma-separated list of patterns to exclude from comparison
77
EXCLUDE_PATTERNS=("${EXCLUDE_RPMS//,/ }") # Convert to array
88
REQUIRES_DIR="rpm_requires" # Directory to store rpm requires output
9+
PACKAGE_CONTENT_DIR="package_content" # Directory to store package content output
10+
EXIT_LATER=0 # Flag to indicate if we should exit later due to differences
911

1012
# === Function: Validate directory existence and non-empty (simple ls check) ===
1113
validate_directory() {
@@ -33,53 +35,72 @@ get_filtered_file_list() {
3335
"${FIND_CMD[@]}" | xargs -r -n1 basename | sort
3436
}
3537

36-
# === Function: Run rpm requires on each file in both directories and save outputs ===
37-
run_rpm_requires() {
38-
local FILES="$1" # multiline string of filenames
39-
mkdir -p "$REQUIRES_DIR/CI"
40-
mkdir -p "$REQUIRES_DIR/REBUILT"
41-
42-
echo "Running rpm requires queries..."
38+
# === Function: Collect rpm requires or content ===
39+
get_rpm_info() {
40+
local FILES="$1"
41+
local MODE="$2"
42+
43+
if [ "$MODE" == "requires" ]; then
44+
mkdir -p "$REQUIRES_DIR/CI"
45+
mkdir -p "$REQUIRES_DIR/REBUILT"
46+
elif [ "$MODE" == "content" ]; then
47+
mkdir -p "$PACKAGE_CONTENT_DIR/CI"
48+
mkdir -p "$PACKAGE_CONTENT_DIR/REBUILT"
49+
else
50+
echo "Error: Invalid mode specified. Use 'requires' or 'content'."
51+
exit 1
52+
fi
4353

4454
while IFS= read -r FILENAME; do
4555
local FILEPATH_CI="$DIR_CI/$FILENAME"
4656
local FILEPATH_REBUILT="$DIR_REBUILT/$FILENAME"
47-
rpm -q --requires -p "$FILEPATH_CI" 2>/dev/null | sed -e 's/>=.*/>=/' -e 's/\([A-Z0-9._]*\)\([0-9]*bit\)$//' -e '/MariaDB-compat/d' -e '/rpmlib(FileCaps)/d' > "$REQUIRES_DIR/CI/$FILENAME.requires"
48-
rpm -q --requires -p "$FILEPATH_REBUILT" 2>/dev/null | sed -e 's/>=.*/>=/' -e 's/\([A-Z0-9._]*\)\([0-9]*bit\)$//' -e '/MariaDB-compat/d' -e '/rpmlib(FileCaps)/d' > "$REQUIRES_DIR/REBUILT/$FILENAME.requires"
57+
58+
if [ "$MODE" == "requires" ]; then
59+
rpm -q --requires -p "$FILEPATH_CI" 2>/dev/null | sed -e 's/>=.*/>=/' -e 's/\([A-Z0-9._]*\)\([0-9]*bit\)$//' -e '/MariaDB-compat/d' -e '/rpmlib(FileCaps)/d' > "$REQUIRES_DIR/CI/$FILENAME.requires"
60+
rpm -q --requires -p "$FILEPATH_REBUILT" 2>/dev/null | sed -e 's/>=.*/>=/' -e 's/\([A-Z0-9._]*\)\([0-9]*bit\)$//' -e '/MariaDB-compat/d' -e '/rpmlib(FileCaps)/d' > "$REQUIRES_DIR/REBUILT/$FILENAME.requires"
61+
elif [ "$MODE" == "content" ]; then
62+
# src_1 to src_0 replacement is to account for in-source (CI build) vs out-of-source (rebuild)
63+
# build-id paths are unique per build, so we exclude them
64+
rpm -qlp "$FILEPATH_CI" 2>/dev/null | sed -e '/\.build-id/d; s@/src_1/@/src_0/@' | sort > "$PACKAGE_CONTENT_DIR/CI/$FILENAME.content"
65+
rpm -qlp "$FILEPATH_REBUILT" 2>/dev/null | sed -e '/\.build-id/d; s@/src_1/@/src_0/@' | sort > "$PACKAGE_CONTENT_DIR/REBUILT/$FILENAME.content"
66+
fi
4967
done <<< "$FILES"
5068
}
5169

52-
# === Function: Compare rpm requires output files and report differences ===
53-
compare_requires() {
70+
71+
# === Function: Compare rpm requires or content ===
72+
compare_rpm_info () {
73+
local MODE="$1"
74+
local DIR="$2"
75+
local OTHER_DIR="$3"
5476
local DIFFS_FOUND=0
55-
echo "Comparing rpm requires files..."
5677

57-
for REQFILE_CI in "$REQUIRES_DIR/CI/"*.requires; do
58-
FILENAME=$(basename "$REQFILE_CI" .requires)
59-
REQFILE_REBUILT="$REQUIRES_DIR/REBUILT/$FILENAME.requires"
78+
for FILE in "$DIR"/*."$MODE"; do
79+
FILENAME=$(basename "$FILE" ".$MODE")
80+
OTHER_FILE="$OTHER_DIR/$FILENAME.$MODE"
6081

61-
if [ ! -f "$REQFILE_REBUILT" ]; then
62-
echo "File '$FILENAME' missing in REBUILT requires output."
82+
if [ ! -f "$OTHER_FILE" ]; then
83+
echo "File '$FILENAME' missing in $OTHER_DIR."
6384
DIFFS_FOUND=1
6485
continue
6586
fi
6687

67-
# Compare ignoring order and whitespace by sorting lines before diff
68-
if ! diff -q <(sort "$REQFILE_CI") <(sort "$REQFILE_REBUILT") >/dev/null; then
88+
if ! diff -q <(sort "$FILE") <(sort "$OTHER_FILE") >/dev/null; then
6989
echo "=================================================================="
70-
echo "Difference found in requires for '$FILENAME':"
90+
echo "Difference found in rpm $MODE for '$FILENAME':"
7191
echo "=================================================================="
72-
diff -u <(sort "$REQFILE_CI") <(sort "$REQFILE_REBUILT")
92+
diff -u <(sort "$FILE") <(sort "$OTHER_FILE") || true
7393
DIFFS_FOUND=1
7494
fi
7595
done
7696

7797
if [ $DIFFS_FOUND -eq 0 ]; then
78-
echo "All rpm requires outputs match."
98+
echo "All rpm $MODE outputs match."
7999
else
80-
echo "Some differences detected in rpm requires outputs."
81-
exit 1
100+
echo "Some differences detected in rpm $MODE outputs."
101+
EXIT_LATER=1
82102
fi
103+
83104
}
84105

85106
# === Main script execution ===
@@ -107,8 +128,20 @@ if [ -n "$ONLY_IN_CI" ] || [ -n "$ONLY_IN_REBUILT" ]; then
107128
else
108129
echo "Success: Files match by name. Continuing processing..."
109130
echo "$FILES_CI" > rpms_to_compare.txt
110-
# Run rpm requires queries and save outputs with filtering
111-
run_rpm_requires "$FILES_CI"
112-
# Compare rpm requires outputs
113-
compare_requires
131+
132+
# Compare rpm requires
133+
get_rpm_info "$FILES_CI" "requires"
134+
compare_rpm_info "requires" "$REQUIRES_DIR/CI" "$REQUIRES_DIR/REBUILT"
135+
136+
# Compare rpm content
137+
get_rpm_info "$FILES_CI" "content"
138+
compare_rpm_info "content" "$PACKAGE_CONTENT_DIR/CI" "$PACKAGE_CONTENT_DIR/REBUILT"
139+
140+
if [ $EXIT_LATER -eq 1 ]; then
141+
echo "Exiting with error due to differences found."
142+
exit 1
143+
else
144+
echo "All checks passed successfully."
145+
exit 0
146+
fi
114147
fi

0 commit comments

Comments
 (0)