Skip to content

Commit 690e2ed

Browse files
Add rpm content compare
1 parent 079e285 commit 690e2ed

1 file changed

Lines changed: 67 additions & 40 deletions

File tree

Lines changed: 67 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
#!/bin/bash
22

3+
set +x # Disable tracing for the script
4+
35
# Configuration
46
DIR_CI=$1 # Directory containing CI built rpms
57
DIR_REBUILT=$2 # Directory containing rebuilt rpms
68
EXCLUDE_RPMS=$3 # Comma-separated list of patterns to exclude from comparison
79
EXCLUDE_PATTERNS=("${EXCLUDE_RPMS//,/ }") # Convert to array
810
REQUIRES_DIR="rpm_requires" # Directory to store rpm requires output
11+
PACKAGE_CONTENT_DIR="package_content" # Directory to store package content output
912

1013
# === Function: Validate directory existence and non-empty (simple ls check) ===
1114
validate_directory() {
@@ -33,53 +36,64 @@ get_filtered_file_list() {
3336
"${FIND_CMD[@]}" | xargs -r -n1 basename | sort
3437
}
3538

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..."
39+
# === Function: Collect rpm requires or content ===
40+
get_rpm_info() {
41+
local FILES="$1"
42+
local MODE="$2"
43+
44+
if [ "$MODE" == "requires" ]; then
45+
mkdir -p "$REQUIRES_DIR/CI"
46+
mkdir -p "$REQUIRES_DIR/REBUILT"
47+
elif [ "$MODE" == "content" ]; then
48+
mkdir -p "$PACKAGE_CONTENT_DIR/CI"
49+
mkdir -p "$PACKAGE_CONTENT_DIR/REBUILT"
50+
else
51+
echo "Error: Invalid mode specified. Use 'requires' or 'content'."
52+
exit 1
53+
fi
4354

4455
while IFS= read -r FILENAME; do
4556
local FILEPATH_CI="$DIR_CI/$FILENAME"
4657
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"
58+
59+
if [ "$MODE" == "requires" ]; then
60+
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"
61+
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"
62+
elif [ "$MODE" == "content" ]; then
63+
# src_1 to src_0 replacement is to account for in-source (CI build) vs out-of-source (rebuild)
64+
# build-id paths are unique per build, so we exclude them
65+
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"
66+
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"
67+
fi
4968
done <<< "$FILES"
5069
}
5170

52-
# === Function: Compare rpm requires output files and report differences ===
53-
compare_requires() {
54-
local DIFFS_FOUND=0
55-
echo "Comparing rpm requires files..."
56-
57-
for REQFILE_CI in "$REQUIRES_DIR/CI/"*.requires; do
58-
FILENAME=$(basename "$REQFILE_CI" .requires)
59-
REQFILE_REBUILT="$REQUIRES_DIR/REBUILT/$FILENAME.requires"
6071

61-
if [ ! -f "$REQFILE_REBUILT" ]; then
62-
echo "File '$FILENAME' missing in REBUILT requires output."
63-
DIFFS_FOUND=1
64-
continue
65-
fi
72+
# === Function: Compare rpm requires or content ===
73+
compare_rpm_info () {
74+
local MODE="$1"
75+
local DIR="$2"
76+
local OTHER_DIR="$3"
77+
local DIFFS_FOUND=0
6678

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")
73-
DIFFS_FOUND=1
79+
touch "${MODE}_DIFFS.txt"
80+
81+
for FILE in "$DIR"/*."$MODE"; do
82+
FILENAME=$(basename "$FILE" ".$MODE")
83+
OTHER_FILE="$OTHER_DIR/$FILENAME.$MODE"
84+
85+
if ! diff -q <(sort "$FILE") <(sort "$OTHER_FILE") >/dev/null; then
86+
{
87+
msg="Difference found in rpm $MODE for '$FILENAME':"
88+
sep=$(printf '%*s' "${#msg}" '' | tr ' ' '=')
89+
echo "$sep"
90+
echo "$msg"
91+
echo "$sep"
92+
diff -u <(sort "$FILE") <(sort "$OTHER_FILE") || true
93+
EXIT_LATER=1
94+
} >> "${MODE}"_DIFFS.txt
7495
fi
7596
done
76-
77-
if [ $DIFFS_FOUND -eq 0 ]; then
78-
echo "All rpm requires outputs match."
79-
else
80-
echo "Some differences detected in rpm requires outputs."
81-
exit 1
82-
fi
8397
}
8498

8599
# === Main script execution ===
@@ -105,10 +119,23 @@ if [ -n "$ONLY_IN_CI" ] || [ -n "$ONLY_IN_REBUILT" ]; then
105119
fi
106120
exit 1
107121
else
122+
EXIT_LATER=0
108123
echo "Success: Files match by name. Continuing processing..."
109124
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
125+
126+
# Compare rpm requires
127+
get_rpm_info "$FILES_CI" "requires"
128+
compare_rpm_info "requires" "$REQUIRES_DIR/CI" "$REQUIRES_DIR/REBUILT"
129+
130+
# Compare rpm content
131+
get_rpm_info "$FILES_CI" "content"
132+
compare_rpm_info "content" "$PACKAGE_CONTENT_DIR/CI" "$PACKAGE_CONTENT_DIR/REBUILT"
133+
134+
if [ $EXIT_LATER -eq 1 ]; then
135+
cat requires_DIFFS.txt content_DIFFS.txt
136+
exit 1
137+
else
138+
echo "All checks passed successfully."
139+
exit 0
140+
fi
114141
fi

0 commit comments

Comments
 (0)