Skip to content

Commit 0bdeeb6

Browse files
Add rpm content compare
1 parent 079e285 commit 0bdeeb6

1 file changed

Lines changed: 66 additions & 30 deletions

File tree

configuration/steps/commands/scripts/srpm_compare.sh

Lines changed: 66 additions & 30 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,74 @@ 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 -u > "$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 -u > "$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+
touch ""${MODE}"_DIFFS.txt"
79+
80+
for FILE in "$DIR"/*."$MODE"; do
81+
FILENAME=$(basename "$FILE" ".$MODE")
82+
OTHER_FILE="$OTHER_DIR/$FILENAME.$MODE"
6083

61-
if [ ! -f "$REQFILE_REBUILT" ]; then
62-
echo "File '$FILENAME' missing in REBUILT requires output."
84+
if [ ! -f "$OTHER_FILE" ]; then
85+
echo "File '$FILENAME' missing in $OTHER_DIR."
6386
DIFFS_FOUND=1
6487
continue
6588
fi
6689

67-
# Compare ignoring order and whitespace by sorting lines before diff
68-
if ! diff -q <(sort "$REQFILE_CI") <(sort "$REQFILE_REBUILT") >/dev/null; then
69-
echo "=================================================================="
70-
echo "Difference found in requires for '$FILENAME':"
71-
echo "=================================================================="
72-
diff -u <(sort "$REQFILE_CI") <(sort "$REQFILE_REBUILT")
90+
if ! diff -q <(sort "$FILE") <(sort "$OTHER_FILE") >/dev/null; then
91+
echo "==================================================================" >> "${MODE}"_DIFFS.txt
92+
echo "Difference found in rpm $MODE for '$FILENAME':" >> "${MODE}"_DIFFS.txt
93+
echo "==================================================================" >> "${MODE}"_DIFFS.txt
94+
diff -u <(sort "$FILE") <(sort "$OTHER_FILE") >> "${MODE}"_DIFFS.txt || true
7395
DIFFS_FOUND=1
7496
fi
7597
done
7698

7799
if [ $DIFFS_FOUND -eq 0 ]; then
78-
echo "All rpm requires outputs match."
100+
echo "All rpm $MODE outputs match."
79101
else
80-
echo "Some differences detected in rpm requires outputs."
81-
exit 1
102+
echo "Some differences detected in rpm $MODE outputs."
103+
EXIT_LATER=1
82104
fi
105+
83106
}
84107

85108
# === Main script execution ===
@@ -107,8 +130,21 @@ if [ -n "$ONLY_IN_CI" ] || [ -n "$ONLY_IN_REBUILT" ]; then
107130
else
108131
echo "Success: Files match by name. Continuing processing..."
109132
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
133+
134+
# Compare rpm requires
135+
get_rpm_info "$FILES_CI" "requires"
136+
compare_rpm_info "requires" "$REQUIRES_DIR/CI" "$REQUIRES_DIR/REBUILT"
137+
138+
# Compare rpm content
139+
get_rpm_info "$FILES_CI" "content"
140+
compare_rpm_info "content" "$PACKAGE_CONTENT_DIR/CI" "$PACKAGE_CONTENT_DIR/REBUILT"
141+
142+
if [ $EXIT_LATER -eq 1 ]; then
143+
echo "Exiting with error due to differences found."
144+
cat requires_DIFFS.txt content_DIFFS.txt
145+
exit 1
146+
else
147+
echo "All checks passed successfully."
148+
exit 0
149+
fi
114150
fi

0 commit comments

Comments
 (0)