kernel/redhat/configs/evaluate_configs

982 lines
25 KiB
Bash
Executable File

#!/usr/bin/bash
trap '[ -d "$tempdir" ] && rm -rf "$tempdir"' EXIT INT
# TODO: -c takes a comma separated list or file?
# TODO: allow for user to specify CONFIGS ^^^ ?
# TODO: move the undo the p setting to map_configs_to_array
# TODO: Fix ERROR: message so it only shows when the file is being deleted
DEBUG=false
# global definitions
CONFIG=
priority_file=
ORDER=
cfgvariants=
toplevels=
subdirs=
rows=
columns=
configmap=
cfgs=
cfgs_base=
weightorig=
numorder=
longheader=
weightorig=
weight=
declare -A toplevel_order
tempdir=$(mktemp -d)
whatcouldgowrong() {
echo ""
echo "usage: evaluate_configs [-c CONFIG] [-d] [-j] [ -p priority_file] [-f]"
echo ""
echo " -c CONFIG Evalulate specific CONFIGs (file or csl)"
echo " -d Enable debug"
echo " -p priority.file Specify a priority.file (no default)"
echo " -j Evaluate common directory"
echo " -f Evaluate CONFIGs"
echo ""
echo "examples)"
echo ""
echo "To show the status of CONFIG_HEADER_TEST in ARK,"
echo " ./evaluate_configs -p priority.rhel -c CONFIG_HEADER_TEST"
echo ""
echo "To fix all the CONFIGS in Fedora,"
echo " ./evaluate_configs -p priority.fedora -f"
echo ""
echo "To fix only CONFIG_HEADER_TEST in RHEL,"
echo " ./evaluate_configs -p priority.rhel -c CONFIG_HEADER_TEST -f"
echo ""
echo "and commit the resulting changes."
echo ""
echo "To fix the common directory entries,"
echo " ./evaluate_configs -j"
echo ""
exit 1
}
# Get a list of the config-variants
get_cfgvariants() { # uses priority_file
local configvariant
local cfgvariant
# The priority files have a config-variant, followed by a hierarchy of
# directories to examine for that config level. The directories have
# '-' instead of '/'.
#
# For example,
#
# ppc64le-debug=generic:generic-powerpc:debug:debug-powerpc
#
while read -r configvariant
do
# ignore any line with whitespace
test -z "$configvariant" && continue
# ignore any line beginning with a #
[[ "$configvariant" == \#* ]] && continue
# ignore any line beginning with ORDER
[[ "$configvariant" == ORDER* ]] && continue
# ignore any line beginning with EMPTY
[[ "$configvariant" == EMPTY* ]] && continue
# -debug variants must include the base variant
# does the priority file contain a debug variant?
cfgvariant=$(echo "$configvariant" | cut -d "=" -f 1)
if grep -q "$cfgvariant-debug" "$priority_file"; then
# if it does, skip this variant and only use -debug
continue
fi
# if this variant has a -debug, remove the -debug
cfgvariant=$(echo "$cfgvariant" | awk -F "-debug" ' { print $1 } ')
# output "cfgvariant | configorder"
echo "$cfgvariant | $(echo "$configvariant" | cut -d "=" -f 2 | tr : " " )"
done < $priority_file
}
# Find top level dirs for each ORDER. These are normally just debug and config.
get_toplevel_dirs() { # uses cfgvariants
local cfg
local cfgvariant
# anything with a dash(-) in it is a subdir
echo "$cfgvariants" | while read -r cfgvariant
do
cfg=$(echo "$cfgvariant" | cut -d "|" -f 2)
for i in $cfg
do
echo "$i" | grep -v "-"
done
done | sort -u | tr '\n' ' '
}
# For each top level count subdirs and find max subdirs for each top level
get_subdirs() { # uses $cfgvariants and $toplevels
local max
local LINE
local count
local toplevel
for toplevel in $toplevels
do
max=0
count=0
OLDIFS=$IFS; IFS=$'\n'; for LINE in $cfgvariants
do
LINE=$(echo "$LINE" | cut -d "|" -f 2)
count=0
IFS=$' '; for i in $LINE
do
echo "$i" | grep -q -v $toplevel && continue
count=$(echo "$i" | awk -F "-" '{print NF-1}')
[ "$max" -lt "$count" ] && max="$count"
done
done
IFS=$OLDIFS
echo "$toplevel subdirs $((max + 1))"
done
}
# Walk through cfgvariants and give each toplevel dir an ordering number.
# This number is later used to insert EMPTY tags at correct place.
create_toplevel_order() { # uses toplevel_order
while read -r cfgvariant
do
local i
local max
local order
local topname
LINE=$(echo "$cfgvariant" | cut -d "|" -f 2)
for i in $LINE; do
topname="${i%%-*}"
order=${toplevel_order[$topname]}
if [ -z "$order" ]; then
max=$(echo "${toplevel_order[@]}" | wc -w)
max=$((max + 1))
toplevel_order[$topname]=$max
$DEBUG && echo "toplevel_order[$topname] = $max"
fi
done
done <<< "$cfgvariants"
}
# For each config-variant, find missing sub-directories and mark them as "EMPTY"
# This is very helpful for stage 3.
fix_config_variants() { # uses $toplevels, $subdirs, $cfgvariants, $toplevel_order
for toplevel in $toplevels
do
local subdircnt
local linenum
local cfgvariant
local LINE
local count
local oldentry
local newentry
local found
local dashcount
local new
local topname
local new_topname
subdircnt=$(echo "$subdirs" | grep "$toplevel" | awk -F "subdirs" ' { print $2 } ')
linenum=0
echo "$cfgvariants" | while read -r cfgvariant
do
linenum=$((linenum + 1))
# this seems strange to immediately reset cfgvariant but we
# want the value from the file, not the one in memory. The
# value in the file may have been modified by a previous
# toplevel.
cfgvariant=$(sed "${linenum}q;d" "$tempdir"/cfgvariants)
LINE=$(echo "$cfgvariant" | cut -d "|" -f 2)
$DEBUG && echo "LINE=$LINE"
# get the actual number of subdirs
count=$(for i in $LINE
do
echo "$i" | grep -q -v "$toplevel" && continue
echo "$i" | awk -F "-" '{print NF-1}'
done | wc -l)
[ -z "$count" ] && continue
$DEBUG && echo "count=$count"
# if the number of subdirs is the same, then bail
[ "$count" -eq "$subdircnt" ] && continue
$DEBUG && echo "missing entries LINE=$LINE"
oldentry=$(for i in $LINE
do
echo "$i" | grep -q "$toplevel" && echo "$i" | tr "\n" " "
done| xargs)
$DEBUG && echo "oldentry=|$oldentry|"
# Find the missing entry
found=$(for i in $oldentry
do
dashcount=$(echo "$i" | awk -F "-" '{print NF-1}')
dashcount=$((dashcount + 1))
echo $dashcount
done | tr "\n" " ")
$DEBUG && echo "found=$found"
# build the missing entry
count=1
newentry=$(for i in $(seq 1 "$subdircnt")
do
if echo "$found" | grep -q "$i"; then
echo "$oldentry" | cut -d " " -f "$count"
count=$((count + 1))
else
echo "${toplevel}-EMPTY$((i - 1))"
fi
done | tr "\n" " " | xargs)
$DEBUG && echo "newentry=|$newentry|"
# insert the missing entry
if echo "$LINE" | grep -q "$toplevel"; then
new=${cfgvariant//$oldentry/$newentry}
else
# Find out toplevel name of new EMPTY entries and use
# toplevel_order to figure out where to insert those.
found=0
new_topname="${newentry%%-*}"
new="$(echo "$cfgvariant" | cut -d "|" -f 1)|"
LINE=$(echo "$cfgvariant" | cut -d "|" -f 2)
for i in $LINE; do
topname="${i%%-*}"
if [ $found -eq 1 -o ${toplevel_order[$topname]} -lt ${toplevel_order[$new_topname]} ]; then
new="$new $i"
else
found=1
new="$new $newentry $i"
fi
done
if [ $found -eq 0 ]; then
new="$new $newentry"
fi
fi
$DEBUG && echo "REPLACED:"
$DEBUG && echo "orig=$cfgvariant"
$DEBUG && echo " new=$new"
sed -i "${linenum}s/${cfgvariant}/${new}/" "$tempdir"/cfgvariants
$DEBUG && echo "----------------------------"
done
done
}
# create a configmap
get_configmap() { # uses $ORDER and $cfgvariants
local configvariant
local arch
local _configorder
local configorder
local order
for order in $ORDER
do
# jforbes: pending-fedora can be dropped. It should be empty
# most of the time.
[ "$order" == "pending-fedora" ] && continue
echo "$cfgvariants" | while read -r configvariant
do
arch=$(echo "$configvariant" | cut -d "|" -f 1)
_configorder=$(echo "$configvariant" | cut -d "|" -f 2 | tr : " " )
configorder=$(for c in $_configorder
do
echo -n "${order}-${c} "
done; echo "")
echo "${order}-$arch | $configorder"
done
done
}
# pretty output
output_pretty_cfgs() { # uses cfgs and configmap, rows, and columns
local x
local index
local _configmap
index=0
for x in $(seq 1 $rows)
do
[ "$x" == 1 ] && echo "legend" "$1"
_configmap=$(echo "$configmap" | sed "${x}q;d" | cut -d "|" -f 1)
echo "$_configmap ${cfgs[@]:$index:$columns}"
index=$((index + columns))
done | column -t
}
# helper function to remove a CONFIG file
delete_file() {
local position
local configentry
position=$1
configentry=$2
# if the entry doesn't exist, decrease weight by 1
weight[$position]=$((weight[$position] - 1))
if [ "${weight[$position]}" -le 0 ]; then
if [ -e "$configentry" ]; then
$DEBUG && echo "| Deleting $configentry ${weight[$position]})" || echo "| Deleting $configentry"
rm -f "$configentry"
fi
else
$DEBUG && echo "| Not deleted. Required by other config variants (${weight[$position]})"
fi
}
# find duplicate entries
fix_broken_arches() { # uses ORDER, crows, columns, and configmap
local row
local x
local y
local value
local _value
local char
local position
local curr
# See comment about weight in create_output_header()
weight=("${weightorig[@]}")
# This search is handled differently than
# output_pretty_cfgs(). A string is created that
# is only for the specific cfg-variant (row * numorder
# long). This string is easier to evaluate.
for row in $(seq 0 $((crows - 1)))
do
# construct the string of values to view
value=$(for order in $(seq 0 $((numorder - 1)))
do
index=$(((order * (crows * columns)) + (row * columns)))
echo -n "${cfgs[@]:$index:$columns} "
done
echo "")
$DEBUG && echo "row=$row $value"
# check to see if there is a config setting conflict
_value=$(echo "$value" | tr -d " X-")
if echo "$_value" | grep -q "yy\|mm\|nn"; then
# go through the value string, ex) y-y-Xm-,
# and find the characters that match the
# previous character.
curr="p"
position=0
# use value here as each character is
# separated by a space
for char in $value
do
index=$(( ((crows * columns) * (position / columns)) + (row * columns) + (position % columns) ))
# sed is 1-based so add 1 to x and y
y=$(((index / columns) + 1))
# configmap contains the cfgvariant and a
# pipe (+3), and needs to be 1-based
x=$(((index % columns) + 4))
$DEBUG && echo "($x,$y) $index"
configentry="$(echo "$configmap" | sed "${y}q;d" | cut -d " " -f "$x" | tr "-" "/")/$CONFIG"
cfgvariant=$(echo "$configmap" | sed "${y}q;d" | cut -d " " -f 1)
# if this, char, is the same as curr then
# there is a conflict and char needs to
# be changed.
if [ "$char" == "$curr" ]; then
echo ""
echo "ERROR: (hierarchy) $configentry : superseding value has $curr."
echo "|$CONFIG ($cfgvariant)"
printf "|$longheader\n|$value" | column -t
$DEBUG && echo "position=$position | $(echo "$value" | cut -d " " -f $((position + 1)) ) | weight=${weight[$position]}"
# See comment about weight in
# create_output_header()
delete_file "$position" "$configentry"
break
fi
case "$char" in
'-')
;;
'X')
# See comment about weight in
# create_output_header()
delete_file "$position" "$configentry"
;;
* )
curr=$char
;;
esac
position=$((position + 1))
done
else
# still have to examine this string because it may
# contain "X", which has to be accounted for in
# the weights.
echo "$value" | grep -q "X" || continue
position=0
for char in $value
do
if [ "$char" == 'X' ]; then
index=$(( ((crows * columns) * (position / columns)) + (row * columns) + (position % columns) ))
# sed is 1-based so add 1 to x and y
y=$(((index / columns) + 1))
# configmap contains the cfgvariant and
# a pipe (+3), and needs to be 1-based
x=$(((index % columns) + 4))
$DEBUG && echo "($x,$y) $index"
configentry="$(echo "$configmap" | sed "${y}q;d" | cut -d " " -f "$x" | tr "-" "/")/$CONFIG"
cfgvariant=$(echo "$configmap" | sed "${y}q;d" | cut -d " " -f 1)
# See comment about weight in
# create_output_header()
delete_file "$position" "$configentry"
fi
position=$((position + 1))
done
fi
done
}
# compare the common, fedora, and ark configs.
# By default this function uses the priority.common file
fix_common() { # uses cfgs, CONFIG, and ORDER
local index
local value
local _value
local x
local y
local configentry
local _configentry
local order
# the priority.common array is
# common configs
# ark configs
# fedora configs
for index in $(seq 0 $(((crows * columns) - 1)))
do
# this string is the concatenation of the
# common, ark, and fedora config values
value=$(for order in $(seq 0 $((numorder -1)))
do
echo -n "${cfgs[$(( (order * crows * columns) + index))]}"
done
echo "")
# It doesn't matter what common is set to so
# trim it off.
_value="${value:1}"
if echo "$_value" | grep -q "yy\|mm\|nn"; then
# set _value to just y|m|n
_value="${_value:1}"
# create a long array to see if the change is valid
checkvalue=$(for order in $(seq 0 $((numorder -1)))
do
step=$(( order * crows * columns))
# this seems weird but it rounds off to columns
row=$(( (step + index) / columns * columns))
echo -n "${cfgs[@]:$row:$columns} "
done; echo "")
$DEBUG && echo "checkvalue=$checkvalue"
IFS=', ' read -r -a checkvalue <<< "$checkvalue"
_index=$((index % columns))
for order in $(seq 1 $((numorder -1)))
do
checkvalue[$((( order * columns ) + _index))]='-'
done
$DEBUG && echo "updated checkvalue=${checkvalue[@]}"
# set the common entry to _value, so that an analysis
# can be run on the other entries
checkvalue[$_index]="$_value"
count=0
cfgvalue=${checkvalue[0]}
warning=false
for i in ${checkvalue[@]}
do
echo "$i" | grep -q 'm\|n\|y' && cfgvalue=$i
if [ $count == $_index ]; then
if [ "$cfgvalue" != "$_value" ]; then
$DEBUG && echo "$CONFIG override will not work."
warning=true
break;
fi
_index=$((_index + columns))
fi
count=$((count + 1))
done
$warning && break
echo "$CONFIG found a match where common should be set."
# sed is 1-based so add 1 to x and y
y=$(((index / columns) + 1))
# configmap contains the cfgvariant and a
# pipe (+3), and needs to be 1-based
x=$(((index % columns) + 4))
$DEBUG && echo "($x,$y) $index"
# remove the existing ark and fedora configs
configentry="$(echo "$configmap" | sed "${y}q;d" | cut -d " " -f "$x" | tr "-" "/")/$CONFIG"
for order in $ORDER
do
[ "$order" == "common" ] && continue
_configentry=${configentry//common/$order}
[ -e "$_configentry" ] && rm -f "$_configentry"
done
# create a new common config
echo "$_value" in "$configentry"
case "$_value" in
m)
echo "${CONFIG}=m" > "$configentry"
;;
y)
echo "${CONFIG}=y" > "$configentry"
;;
n)
echo "# $CONFIG is not set" > "$configentry"
;;
esac
fi
done
}
# Check that ccolumns is consistent
debug_cfgvariants() { # uses $cfgvariants and sets crows and ccolumns
local LINE
crows=$(echo "$cfgvariants" | wc -l)
ccolumns=$(echo "$cfgvariants" | while read -r LINE
do
LINE=$(echo "$LINE" | cut -d "|" -f 2)
echo "$LINE" | wc -w
done | sort -u)
# Error check columns
if [ "$(echo "$ccolumns" | wc -l)" != "1" ]; then
echo "ERROR in parser. There were multiple length columns found."
echo "$ccolumns"
exit 1
fi
}
# Create an output header, a fancy long header for fix_broken_arches, and the
# weights
create_output_header() { # uses $ORDER, $configmap, and sets output_header
# and weightorig
local order
local dir
local convert
local f
local configline
# We know that the configmap now contains correct sized entries for
# each arch. The arch doesn't really matter and we just need the
# information to make a header.
order=$(echo "$ORDER" | cut -d " " -f 1)
configline=$(echo "$configmap" | head -1 | cut -d "|" -f 2 | sed "s/${order}-//g")
for dir in $configline
do
convert=false
if echo "$dir" | grep -q "-"; then
if echo "$dir" | grep -q "EMPTY0"; then
dir=$(echo "$dir" | awk -F "-EMPTY0" ' { print $1 } ')
convert=true
fi
else
convert=true
fi
! $convert && continue
# get the first letter of each word
f=$(echo "$dir" | head -c 1)
$DEBUG && echo "directory $dir entries will be converted to $f"
configline=${configline//$dir/$f}
done
# Go through the configline and convert the directory names into header
# names For example,
# generic generic-x86 generic-x86-x86_64 generic-EMPTY3 debug-EMPTY0 debug-EMPTY1 debug-EMPTY2
# will be converted to
# g ga1 ga2 ga3 d da1 da2
output_header=$(for dir in $configline
do
# convert dirs with no dashes to the same thing
if ! echo "$dir" | grep -q "-"; then
echo "$dir"
continue
fi
f=$(echo "$dir" | cut -d "-" -f 1)
# convert g-x86 to ga, and g-x86-x86_64 to ga2, etc.
if echo "$dir" | grep -q "EMPTY"; then
numempty=$(echo "$dir" | awk -F "EMPTY" ' { print $2 } ')
if [ "$numempty" -eq 0 ]; then
echo "$f"
else
echo "${f}a${numempty}"
fi
else
numdashes=$(echo "$dir"| grep -o "-" | wc -l)
echo "${f}a${numdashes}"
fi
done | tr "\n" " ")
# create a weightorig array that contains the weights of change for
# each directory. This is useful for the -f option display
for entry in $output_header
do
if echo "$entry" | grep -q 'a'; then
_weightorig+=(1)
else
_weightorig+=("$crows")
fi
done
# It is possible (and valid) to have an subdir arch followed by
# a debug entry. The -f checker would have flagged this and
# removed the file. As a solution there is a weight associated
# with each entry's CONFIG file. A debug or generic entry has
# a weight equal the number of columns, and the arch entries all
# have a weight of one. The -f tracker subtracts one for each "hit"
# and only removes the file if the weight is 1.
weightorig=""
longheader=""
for order in $(seq 1 $numorder)
do
weightorig="${weightorig[@]} ${_weightorig[@]}"
longheader="${longheader}${output_header}"
done
IFS=', ' read -r -a weightorig <<< "$weightorig"
}
# initialize the array to '-' (undefined) and 'X' (not present/EMPTY)
init_cfgs() { #uses cfgs, rows, and columns
unset cfgs
eval "$(eval echo "cfgs[{1..$((rows * columns))}]='-'\;")"
# the -'s can be a problem when being parsed by other commands. I
# tried using +, o, ., X, etc. but none of the output was as clear as
# a dash. Initialize the 0th element to an unused letter. If still
# 'p' it can be changed back later on.
cfgs[0]=p
# set EMPTY configs to X
for row in $(seq 0 $((rows - 1)))
do
index=$((row * columns))
num=0
for entry in $(echo "$cfgvariants" | sed "$(((row % crows) + 1))q;d" | cut -d "|" -f 2)
do
echo "$entry" | grep -q EMPTY && cfgs[$((index + num))]='X'
num=$((num + 1))
done
done
cfgs_base=("${cfgs[@]}")
}
# reset the configs to default
reset_cfgs() {
unset cfgs
cfgs=("${cfgs_base[@]}")
}
# map the CONFIG files to the array
map_configs_to_array() { #uses CONFIG, configmap, cfgs
local LINE
local contents
local _LINE
local row
local cols
local col
for LINE in $(find ./ -name $CONFIG -printf '%P\n' | awk -F "/$CONFIG" ' { print $1 } ')
# loop through the CONFIG files
do
$DEBUG && echo "+-------------------"
$DEBUG && echo "found: $LINE"
contents=$(grep "^# $CONFIG is not set\|^$CONFIG=" "$LINE"/"$CONFIG")
case $contents in
"# $CONFIG is not set")
contents=n
;;
"${CONFIG}=y")
contents=y
;;
"${CONFIG}=m")
contents=m
;;
*)
echo "$LINE/$CONFIG has a strange entry ... skipping"
return 1
break;;
esac
$DEBUG && echo "contents=$contents"
_LINE=$(echo "$LINE" | tr "/" "-")
$DEBUG && echo "_LINE=$_LINE"
# set each cfg to $contents
OLDIFS=$IFS; IFS=$'\n'; for rowandcol in $(echo "$configmap" | grep -n " $_LINE ")
do
row=$(echo "$rowandcol" | cut -d ":" -f 1)
# grep is 1 based and we need a 0 based number
row=$((row - 1))
cols=$(echo "$rowandcol" | cut -d "|" -f 2)
$DEBUG && echo "row=$row"
$DEBUG && echo "cols=$cols"
col=$(echo "$cols" | awk -F "$_LINE" ' { print $1 }' | wc -w)
$DEBUG && echo "($col, $row) = $contents"
# convert the (col,row) to an index in the array
$DEBUG && echo "setting element $(($((row * columns)) + col)) = $contents"
# set the config
cfgs[$(($((row * columns)) + col))]=$contents
done
IFS=$OLDIFS
done
# undo the 'p' setting of the initial element
# (setting to 'p' done in init_cfgs)
[ "${cfgs[0]}" == "p" ] && cfgs[0]="-"
return 0
}
generate_finalconfiglist() {
awk '
/is not set/ {
split ($0, a, "#");
split(a[2], b);
print b[1] ;
}
/=/ {
split ($0, a, "=");
print a[1];
}
' *.config | sort -u >> .finalconfiglist
}
find_dead_configs() {
echo > .finalconfiglist
echo > .configlist
grep -q "rhel" flavors && (cd ..; make rh-configs) && generate_finalconfiglist
grep -q "fedora" flavors && (cd ..; make fedora-configs) && generate_finalconfiglist
sort -o .finalconfiglist -u .finalconfiglist
find ./ -name CONFIG_* | sed 's!.*/!!' | sort -u > .configlist
echo "These CONFIGS defined in redhat/configs but not the final .configs have been deleted:"
comm .configlist .finalconfiglist -2 -3 | while read FILENAME
do
echo $FILENAME
find ./ -name $FILENAME | xargs rm -f
done
rm -f .configlist .finalconfiglist
}
#
#
# MAIN
#
#
# PROCESS ARGUMENTS
FINDFIXES=false
FIXCOMMON=false
configs=
while getopts "c:dDfhjp:" opt; do
case ${opt} in
c )
configs=$OPTARG
;;
d )
DEBUG=true
;;
D )
find_dead_configs
exit 0
;;
f )
# Find fixes per config-variant
FINDFIXES=true
;;
h )
whatcouldgowrong
;;
j )
# jforbes mode
priority_file=priority.common
FIXCOMMON=true
;;
p )
# Get the high level order from the priority file
priority_file=$OPTARG
;;
*)
whatcouldgowrong
;;
esac
done
$DEBUG && echo "priority_file=$priority_file"
$DEBUG && echo "configs=$CONFIG"
$DEBUG && echo "FINDFIXES=$FINDFIXES"
$DEBUG && echo "FIXCOMMON=$FIXCOMMON"
# Do some simple error checking
if [ -z "$priority_file" ]; then
echo "Specify a priority.* file"
whatcouldgowrong
fi
# if configs is not set then do all CONFIGS
if [ -z "$configs" ]; then
find ./ -name "CONFIG*" -type f -printf "%f\n" | sort -u > "$tempdir"/CONFIGS
configs=$tempdir/CONFIGS
fi
# if configs is still not set, then parse the argument provided
if [ ! -e "$configs" ]; then
# assume the user is smart enough to specify CONFIGs
for config in ${configs//,/ }
do
# Allow users to specify configs without CONFIG_
if ! echo "$config" | grep -q CONFIG; then
config="CONFIG_${config}"
fi
echo "$config" >> "$tempdir"/CONFIGS
done
configs=$tempdir/CONFIGS
else
# if the file exists just copy it
[ ! -e "$tempdir"/CONFIGS ] && cp "$configs" "$tempdir"/CONFIGS
fi
ORDER=$(grep "^ORDER" "$priority_file"| cut -d "=" -f 2)
# STEP 1. Parse the priority file
cfgvariants=$(get_cfgvariants)
$DEBUG && echo "----------------------------------------"
$DEBUG && echo "cfgvariants:"
$DEBUG && echo "$cfgvariants"
$DEBUG && echo "----------------------------------------"
toplevels=$(get_toplevel_dirs "$cfgvariants")
$DEBUG && echo "Top level directories in priority file: $toplevels"
subdirs=$(get_subdirs)
$DEBUG && echo "Top-level sub-directories:"
$DEBUG && echo "$subdirs"
# Create ordering for toplevel dirs
create_toplevel_order
# Add EMPTY entries for each missing subdirectory level in the config
# variants
echo "$cfgvariants" > "$tempdir"/cfgvariants
fix_config_variants
$DEBUG && echo ""
$DEBUG && echo ""
$DEBUG && echo "Fixed: cfgvariants"
$DEBUG && cat "$tempdir"/cfgvariants
# Reset cfgvariants to new values with EMPTYs.
# cfgvariants now contains the config-variant data with EMPTY subdirs.
cfgvariants=$(cat "$tempdir"/cfgvariants)
crows=
ccolumns=
debug_cfgvariants
$DEBUG && echo "For the config-variants there are $crows rows and $ccolumns columns."
# STEP 2. Now that we have fixed the list of config variants, create a config
# map that contains all entries wrt the ORDER specified in the priority file.
numorder=$(echo "$ORDER" | wc -w)
# jforbes: pending-fedora can be dropped. It should be empty
# most of the time.
echo "$ORDER" | grep -q "pending-fedora" && numorder=$((numorder -1))
# configmap is the list of config-variants used for displaying and analyzing
# the CONFIGs.
configmap=$(get_configmap)
$DEBUG && echo " "
$DEBUG && echo "The configmap is:"
$DEBUG && echo "$configmap"
$DEBUG && echo " "
# STEP 3. Create an array and header to hold the configmap data.
rows=$(echo "$configmap" | wc -l)
columns=$(echo "$configmap" | head -1 | cut -d "|" -f 2 | wc -w)
$DEBUG && echo "There are $rows rows and $columns columns in the configmap."
create_output_header # sets output_header
$DEBUG && echo "output_header=|$output_header|"
$DEBUG && echo "longheader=|$longheader|"
$DEBUG && echo "output_header has weights ${weightorig[@]}"
# create the cfgs array and initialize it to '-' (not found)
init_cfgs
if $FINDFIXES; then
while read -r CONFIG
do
reset_cfgs
map_configs_to_array || continue
fix_broken_arches "$output_header"
done < "$tempdir"/CONFIGS
exit
fi
if $FIXCOMMON; then
while read -r CONFIG
do
reset_cfgs
map_configs_to_array || continue
fix_common
done < "$tempdir"/CONFIGS
exit
fi
# only display the configs
while read -r CONFIG
do
reset_cfgs
map_configs_to_array || continue
echo ""
echo "$CONFIG"
output_pretty_cfgs "$output_header"
done < "$tempdir"/CONFIGS
exit