Skip to content

Commit 92495d4

Browse files
Add rpm content compare
1 parent 079e285 commit 92495d4

1 file changed

Lines changed: 66 additions & 41 deletions

File tree

Lines changed: 66 additions & 41 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,62 @@ 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"
60-
61-
if [ ! -f "$REQFILE_REBUILT" ]; then
62-
echo "File '$FILENAME' missing in REBUILT requires output."
63-
DIFFS_FOUND=1
64-
continue
65-
fi
6671

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
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+
78+
touch "${MODE}_DIFFS.txt"
79+
for FILE in "$DIR"/*."$MODE"; do
80+
FILENAME=$(basename "$FILE" ".$MODE")
81+
OTHER_FILE="$OTHER_DIR/$FILENAME.$MODE"
82+
83+
if ! diff -q <(sort "$FILE") <(sort "$OTHER_FILE") >/dev/null; then
84+
{
85+
msg="Difference found in rpm $MODE for '$FILENAME':"
86+
sep=$(printf '%*s' "${#msg}" '' | tr ' ' '=')
87+
echo "$sep"
88+
echo "$msg"
89+
echo "$sep"
90+
diff -u <(sort "$FILE") <(sort "$OTHER_FILE") || true
91+
EXIT_LATER=1
92+
} >> "${MODE}"_DIFFS.txt
7493
fi
7594
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
8395
}
8496

8597
# === Main script execution ===
@@ -105,10 +117,23 @@ if [ -n "$ONLY_IN_CI" ] || [ -n "$ONLY_IN_REBUILT" ]; then
105117
fi
106118
exit 1
107119
else
120+
EXIT_LATER=0
108121
echo "Success: Files match by name. Continuing processing..."
109122
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
123+
124+
# Compare rpm requires
125+
get_rpm_info "$FILES_CI" "requires"
126+
compare_rpm_info "requires" "$REQUIRES_DIR/CI" "$REQUIRES_DIR/REBUILT"
127+
128+
# Compare rpm content
129+
get_rpm_info "$FILES_CI" "content"
130+
compare_rpm_info "content" "$PACKAGE_CONTENT_DIR/CI" "$PACKAGE_CONTENT_DIR/REBUILT"
131+
132+
if [ $EXIT_LATER -eq 1 ]; then
133+
cat requires_DIFFS.txt content_DIFFS.txt
134+
exit 1
135+
else
136+
echo "All checks passed successfully."
137+
exit 0
138+
fi
114139
fi

0 commit comments

Comments
 (0)