11#! /bin/bash
22
3+ set +x # Disable tracing for the script
4+
35# Configuration
46DIR_CI=$1 # Directory containing CI built rpms
57DIR_REBUILT=$2 # Directory containing rebuilt rpms
68EXCLUDE_RPMS=$3 # Comma-separated list of patterns to exclude from comparison
79EXCLUDE_PATTERNS=(" ${EXCLUDE_RPMS// ,/ } " ) # Convert to array
810REQUIRES_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) ===
1114validate_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
107119else
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
114139fi
0 commit comments