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

(-)a/altlinux/grub-entries (-20 / +91 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=$(sed -n 's/^saved_entry=//p' "$grubenv_file")
87
		next_entry=$(sed -n 's/^next_entry=//p' "$grubenv_file")
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
		case "$line" in
95
		*"menuentry "*)	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
			;;
104
		*"submenu "*)	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
			;;
113
		*"}"*)		mode="E" ;;
114
		*)		mode="" ;;
115
		esac
72
116
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
117
		case "$mode" in
82
		M)	if [ $numbers_only -ne 0 ]; then
118
		M)	# Menu entry
83
				echo -e "${number}${itemno}"
119
			# Build full ID path
120
			if [ -n "$id_prefix" ]; then
121
				full_id="${id_prefix}>${id}"
122
			else
123
				full_id="$id"
124
			fi
125
126
			# Set markers based on both ID and title
127
			mark=""
128
			[ -n "$saved_entry" ] && [ "$full_id" = "$saved_entry" ] ||
129
						 [ "$full_title" = "$saved_entry" ] && mark="*"
130
			[ -n "$next_entry" ]  && [ "$full_id" = "$next_entry" ]  ||
131
						 [ "$full_title" = "$next_entry" ]  && mark="${mark}N"
132
			mark=$(printf '%-3s' "$mark")
133
134
			# Format output with proper alignment
135
			if [ $numbers_only -ne 0 ]; then
136
				echo "${number}${itemno}"
84
			elif [ $titles_only -ne 0 ]; then
137
			elif [ $titles_only -ne 0 ]; then
85
				echo -e "${prefix}${title}"
138
				echo "${full_title}"
86
			else
139
			else
87
				echo -e "${number}${itemno}\t${prefix}${title}"
140
				printf "%-6s%-4s%s\n" "${number}${itemno}" "$mark" "$full_title"
88
			fi
141
			fi
89
			itemno=$(($itemno + 1))
142
143
			itemno=$((itemno + 1))
90
			entry=1
144
			entry=1
91
			;;
145
			;;
92
		S)	number="${number}${itemno}>"
146
147
		S)	# Submenu entry
148
			# Update ID prefix
149
			if [ -n "$id_prefix" ]; then
150
				id_prefix="${id_prefix}>${id}"
151
			else
152
				id_prefix="$id"
153
			fi
154
155
			# Update numbering
156
			number="${number}${itemno}>"
93
			prefix="${prefix}${title}>"
157
			prefix="${prefix}${title}>"
94
			itemno=0
158
			itemno=0
95
			;;
159
			;;
96
		*)	if [ $entry -ne 0 ]; then
160
161
		E)	# End of menu
162
			if [ $entry -ne 0 ]; then
97
				entry=0
163
				entry=0
98
			elif [ -n "$number" ]; then
164
			elif [ -n "$number" ]; then
165
				# Handle menu closure
99
				number="${number%>}"
166
				number="${number%>}"
100
				prefix="${prefix%>}"
167
				prefix="${prefix%>}"
168
				id_prefix="${id_prefix%>*}"
169
101
				case "$number" in
170
				case "$number" in
102
				*">"*)	itemno="${number##*>}"
171
				*">"*)	# Submenu closed
172
					itemno="${number##*>}"
103
					number="${number%>*}>"
173
					number="${number%>*}>"
104
					prefix="${prefix%>*}>"
174
					prefix="${prefix%>*}>"
105
					itemno=$(($itemno + 1))
175
					itemno=$((itemno + 1))
106
					;;
176
					;;
107
				*)	itemno=$number
177
				*)	# Top-level closed
108
					itemno=$(($itemno + 1))
178
					itemno=$number
179
					itemno=$((itemno + 1))
109
					prefix=
180
					prefix=
110
					number=
181
					number=
182
					id_prefix=
111
					;;
183
					;;
112
				esac
184
				esac
113
			fi
185
			fi
114
- 

Return to bug 54130