View | Details | Raw Unified | Return to bug 54130
Collapse All | Expand All

(-)a/altlinux/grub-entries (-20 / +98 lines)
Lines 67-113 parse_args() { Link Here
67
	[ $# -eq 0 ] || show_usage "Unrecognized arguments: '$*'"
67
	[ $# -eq 0 ] || show_usage "Unrecognized arguments: '$*'"
68
}
68
}
69
69
70
get_menu_id() {
71
	echo "$1" | sed -ne "
72
		s/.*menuentry_id_option\s\+'\([^']*\)'.*/\1/p;
73
		t;
74
		s/.*menuentry_id_option\s\+\"\([^\"]*\)\".*/\1/p;
75
	"
76
}
77
70
show_menu() {
78
show_menu() {
71
	local mode= title= number= prefix= entry=0 itemno=0
79
	local mode= title= number= prefix= entry=0 itemno=0
80
	local grubenv_file= saved_entry= next_entry= mark=
81
	local id_prefix= full_id= full_title= id= line=
82
83
	# Get current GRUB settings
84
	grubenv_file="${grubmenu%/*}/grubenv"
85
	if [ -f "$grubenv_file" ]; then
86
		saved_entry=$(grub-editenv "$grubenv_file" list | grep '^saved_entry=' | cut -d= -f2-)
87
		next_entry=$(grub-editenv "$grubenv_file" list | grep '^next_entry=' | cut -d= -f2-)
88
	fi
89
90
	# Process GRUB menu
91
	sed -n -re '/^\s*(menuentry\s+|submenu\s+|})/p' "$grubmenu" |
92
	while IFS= read -r line; do
93
		# Determine entry type
94
		if echo "$line" | grep -q '^\s*menuentry'; then
95
			mode="M"
96
			title=$(echo "$line" | sed -re "
97
				s/^\s*menuentry\s+'(([^']|\\\\')+)'.*/\1/;
98
				t;
99
				s/^\s*menuentry\s+\"(([^\"]|\\\\\")+)\".*/\1/;
100
			")
101
			id=$(get_menu_id "$line")
102
			full_title="${prefix}${title}"
103
		elif echo "$line" | grep -q '^\s*submenu'; then
104
			mode="S"
105
			title=$(echo "$line" | sed -re "
106
				s/^\s*submenu\s+'(([^']|\\\\')+)'.*/\1/;
107
				t;
108
				s/^\s*submenu\s+\"(([^\"]|\\\\\")+)\".*/\1/;
109
			")
110
			id=$(get_menu_id "$line")
111
			full_title="${prefix}${title}"
112
		elif echo "$line" | grep -q '^\s*}'; then
113
			mode="E"
114
		else
115
			mode=""
116
		fi
72
117
73
	cat "$grubmenu" | sed \
74
		-re '/^\s*(menuentry\s+|submenu\s+|})/!d' \
75
		-re "s/^\s*menuentry\s+'([^']+)'.*\$/M\t\1/g" \
76
		-re 's/^\s*menuentry\s+"([^"]+)".*$/M\t\1/g' \
77
		-re "s/^\s*submenu\s+'([^']+)'.*\$/S\t\1/g" \
78
		-re 's/^\s*submenu\s+"([^"]+)".*$/S\t\1/g' \
79
		-re "s/^\s*}\s*\$/E\t-/g" |
80
	while read mode title; do
81
		case "$mode" in
118
		case "$mode" in
82
		M)	if [ $numbers_only -ne 0 ]; then
119
		M)	# Menu entry
83
				echo -e "${number}${itemno}"
120
			# Build full ID path
121
			if [ -n "$id_prefix" ]; then
122
				full_id="${id_prefix}>${id}"
123
			else
124
				full_id="$id"
125
			fi
126
127
			# Set markers based on both ID and title
128
			mark=""
129
			if [ -n "$saved_entry" ]; then
130
				if [ "$full_id" = "$saved_entry" ] || [ "$full_title" = "$saved_entry" ]; then
131
					mark="*"
132
				fi
133
			fi
134
			if [ -n "$next_entry" ]; then
135
				if [ "$full_id" = "$next_entry" ] || [ "$full_title" = "$next_entry" ]; then
136
					mark="${mark}N"
137
				fi
138
			fi
139
			mark=$(printf '%-3s' "$mark")
140
141
			# Format output with proper alignment
142
			if [ $numbers_only -ne 0 ]; then
143
				echo "${number}${itemno}"
84
			elif [ $titles_only -ne 0 ]; then
144
			elif [ $titles_only -ne 0 ]; then
85
				echo -e "${prefix}${title}"
145
				echo "${full_title}"
86
			else
146
			else
87
				echo -e "${number}${itemno}\t${prefix}${title}"
147
				printf "%-6s%-4s%s\n" "${number}${itemno}" "${mark}" "${full_title}"
88
			fi
148
			fi
89
			itemno=$(($itemno + 1))
149
150
			itemno=$((itemno + 1))
90
			entry=1
151
			entry=1
91
			;;
152
			;;
92
		S)	number="${number}${itemno}>"
153
154
		S)	# Submenu entry
155
			# Update ID prefix
156
			if [ -n "$id_prefix" ]; then
157
				id_prefix="${id_prefix}>${id}"
158
			else
159
				id_prefix="$id"
160
			fi
161
162
			# Update numbering
163
			number="${number}${itemno}>"
93
			prefix="${prefix}${title}>"
164
			prefix="${prefix}${title}>"
94
			itemno=0
165
			itemno=0
95
			;;
166
			;;
96
		*)	if [ $entry -ne 0 ]; then
167
168
		E)	# End of menu
169
			if [ $entry -ne 0 ]; then
97
				entry=0
170
				entry=0
98
			elif [ -n "$number" ]; then
171
			elif [ -n "$number" ]; then
172
				# Handle menu closure
99
				number="${number%>}"
173
				number="${number%>}"
100
				prefix="${prefix%>}"
174
				prefix="${prefix%>}"
175
				id_prefix="${id_prefix%>*}"
176
101
				case "$number" in
177
				case "$number" in
102
				*">"*)	itemno="${number##*>}"
178
				*">"*)	# Submenu closed
179
					itemno="${number##*>}"
103
					number="${number%>*}>"
180
					number="${number%>*}>"
104
					prefix="${prefix%>*}>"
181
					prefix="${prefix%>*}>"
105
					itemno=$(($itemno + 1))
182
					itemno=$((itemno + 1))
106
					;;
183
					;;
107
				*)	itemno=$number
184
				*)	# Top-level closed
108
					itemno=$(($itemno + 1))
185
					itemno=$number
186
					itemno=$((itemno + 1))
109
					prefix=
187
					prefix=
110
					number=
188
					number=
189
					id_prefix=
111
					;;
190
					;;
112
				esac
191
				esac
113
			fi
192
			fi
114
- 

Return to bug 54130