-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathdiff-kernel-configs
More file actions
executable file
·116 lines (101 loc) · 2.03 KB
/
diff-kernel-configs
File metadata and controls
executable file
·116 lines (101 loc) · 2.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/bin/bash -eu
#
# Diff two or more kernel config files
#
function read_configfile()
{
local array=${1} configfile=${2}
local line config val
while IFS= read -r line ; do
case "${line}" in
"# CONFIG_"*)
config=${line#\# CONFIG_}
config=${config%% *}
val="n"
;;
"CONFIG_"*)
config=${line#CONFIG_}
config=${config%%=*}
val=${line#*=}
;;
*)
continue
;;
esac
eval "${array}[${config}]=${val}"
done < <(cat "${configfile}")
}
function usage()
{
cat <<EOF
Usage: diff-kernel-configs [-d] [-h] CONFIGFILE CONFIGFILE [CONFIGFILE...]
Diff two or more kernel config files.
Optional arguments:
-d. --diff-only Only show differences.
-h, --help Show this help text and exit.
EOF
}
diff_only=0
files=()
while [ $# -gt 0 ] ; do
case "${1}" in
-d|--diff-only)
diff_only=1
;;
-h|--help)
usage
exit
;;
-*)
echo "Invalid argument: ${1}" >&2
exit 2
;;
*)
if ! [ -f "${1}" ] ; then
echo "No such file: ${1}" >&2
exit 1
fi
files+=("${1}")
;;
esac
shift
done
if [ ${#files[@]} -lt 2 ] ; then
usage
exit 2
fi
# Read the configs files into associative arrays
for i in $(seq 0 $((${#files[@]} - 1))) ; do
declare -A "CONFIGS_${i}"
read_configfile "CONFIGS_${i}" "${files[${i}]}"
done
# Print a header line
printf "%-40s" "CONFIG"
for f in "${files[@]}" ; do
printf "%-40s" "${f::39}"
done
printf "\n"
# Print the config values
while IFS= read -r line ; do
config=${line#*CONFIG_}
config=${config%% *}
config=${config%%=*}
# first value (reference)
ref_val=${CONFIGS_0[${config}]}
diff=0
line=$(printf "%-40s%-40s" "${config}" "${ref_val}")
for i in $(seq 1 $((${#files[@]} - 1))) ; do
var=CONFIGS_${i}[${config}]
val="${!var:--}"
if [ "${val}" = "${ref_val}" ] ; then
color="\e[32m" # green
else
diff=1
color="\e[93m" # orange
fi
line=${line}$(printf "%-49s" "$(echo -e "${color}${val}\e[0m")")
done
if [ ${diff_only} -eq 0 ] || [ ${diff} -eq 1 ] ; then
echo "${line}"
fi
done < <(grep -P '^(# )?CONFIG_' "${files[0]}")