* [PATCH v2 0/2] Improve kernel sorting in grub-mkconfig
@ 2022-01-20 16:45 Robbie Harwood
2022-01-20 16:45 ` [PATCH v2 1/2] Correct sorting of kernel names containing '_' Robbie Harwood
2022-01-20 16:45 ` [PATCH v2 2/2] mkconfig: use distro sorts when available Robbie Harwood
0 siblings, 2 replies; 6+ messages in thread
From: Robbie Harwood @ 2022-01-20 16:45 UTC (permalink / raw)
To: grub-devel; +Cc: development, Robbie Harwood
This version of the patchset formally adds the distro sort support from
the previous thread, as well as attempting to address Glenn's review
suggestions around ordering and usage criteria.
Be well,
--Robbie
Robbie Harwood (2):
Correct sorting of kernel names containing '_'
mkconfig: use distro sorts when available
util/grub-mkconfig_lib.in | 90 +++++++++++++++++++++------------------
1 file changed, 49 insertions(+), 41 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/2] Correct sorting of kernel names containing '_'
2022-01-20 16:45 [PATCH v2 0/2] Improve kernel sorting in grub-mkconfig Robbie Harwood
@ 2022-01-20 16:45 ` Robbie Harwood
2022-01-20 16:45 ` [PATCH v2 2/2] mkconfig: use distro sorts when available Robbie Harwood
1 sibling, 0 replies; 6+ messages in thread
From: Robbie Harwood @ 2022-01-20 16:45 UTC (permalink / raw)
To: grub-devel; +Cc: development, Robbie Harwood
sort(1) from GNU coreutils does not treat underscore as part of a
version number for `sort -V. This causes misorderings on x86_64, where
e.g. kernel-core-3.17.6-300.11.fc21.x86_64 will incorrectly sort
*before* kernel-core-3.17.6-300.fc21.x86_64.
To cope with this behavior, replace underscores with dashes in order to
approximate their intended meaning as version component separators.
Fixes: https://savannah.gnu.org/bugs/?42844
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
---
util/grub-mkconfig_lib.in | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 301d1ac22..23d41475f 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -243,8 +243,8 @@ version_test_numeric ()
version_test_gt ()
{
- version_test_gt_a="`echo "$1" | sed -e "s/[^-]*-//"`"
- version_test_gt_b="`echo "$2" | sed -e "s/[^-]*-//"`"
+ version_test_gt_a="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
+ version_test_gt_b="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
version_test_gt_cmp=gt
if [ "x$version_test_gt_b" = "x" ] ; then
return 0
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] mkconfig: use distro sorts when available
2022-01-20 16:45 [PATCH v2 0/2] Improve kernel sorting in grub-mkconfig Robbie Harwood
2022-01-20 16:45 ` [PATCH v2 1/2] Correct sorting of kernel names containing '_' Robbie Harwood
@ 2022-01-20 16:45 ` Robbie Harwood
2022-01-20 19:00 ` Glenn Washburn
2022-01-20 22:07 ` Didier Spaier
1 sibling, 2 replies; 6+ messages in thread
From: Robbie Harwood @ 2022-01-20 16:45 UTC (permalink / raw)
To: grub-devel; +Cc: development, Robbie Harwood
For Debian-likes and Fedora-likes, use the distribution's sorting tools
to determine the latest package before falling back to sort(1). While
Fedora's rpmdev-vercmp(1) is likely unavailable, Debian's is built into
dpkg itself, and hence likely present.
Refactor to remove unused code and make it easy to add other package
managers as needed.
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
---
util/grub-mkconfig_lib.in | 90 +++++++++++++++++++++------------------
1 file changed, 49 insertions(+), 41 deletions(-)
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 23d41475f..cc0ab790e 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -200,62 +200,70 @@ grub_file_is_not_garbage ()
return 0
}
-version_sort ()
+# A $SORT function returns 0 if $1 is newer than $2, and 1 otherwise. Other
+# package managers can be plugged in here as needed with their own functions.
+sort_dpkg ()
{
- case $version_sort_sort_has_v in
- yes)
- LC_ALL=C sort -V;;
- no)
- LC_ALL=C sort -n;;
- *)
- if sort -V </dev/null > /dev/null 2>&1; then
- version_sort_sort_has_v=yes
- LC_ALL=C sort -V
- else
- version_sort_sort_has_v=no
- LC_ALL=C sort -n
- fi;;
- esac
+ left="`echo "$1" | sed -e "s/^[^0-9]*//"`"
+ right="`echo "$2" | sed -e "s/^[^0-9]*//"`"
+ dpkg --compare-versions "$left" gt "$right"
}
-version_test_numeric ()
+sort_rpm ()
{
- version_test_numeric_a="$1"
- version_test_numeric_cmp="$2"
- version_test_numeric_b="$3"
- if [ "$version_test_numeric_a" = "$version_test_numeric_b" ] ; then
- case "$version_test_numeric_cmp" in
- ge|eq|le) return 0 ;;
- gt|lt) return 1 ;;
- esac
- fi
- if [ "$version_test_numeric_cmp" = "lt" ] ; then
- version_test_numeric_c="$version_test_numeric_a"
- version_test_numeric_a="$version_test_numeric_b"
- version_test_numeric_b="$version_test_numeric_c"
- fi
- if (echo "$version_test_numeric_a" ; echo "$version_test_numeric_b") | version_sort | head -n 1 | grep -qx "$version_test_numeric_b" ; then
- return 0
- else
- return 1
+ left="`echo "$1" | sed -e "s/^[^0-9]*//"`"
+ right="`echo "$2" | sed -e "s/^[^0-9]*//"`"
+ rpmdev-vercmp "$left" "$right" >/dev/null
+ if [ $? -eq 12 ]; then
+ return 0;
fi
+ return 1;
+}
+
+sort_V ()
+{
+ left="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
+ right="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
+ printf "$left\n$right\n" | LC_ALL=C sort -V | head -n1 | grep -qx "$right"
+}
+
+sort_n ()
+{
+ left="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
+ right="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
+ printf "$left\n$right\n" | LC_ALL=C sort -n | head -n1 | grep -qx "$right"
}
version_test_gt ()
{
- version_test_gt_a="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
- version_test_gt_b="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
- version_test_gt_cmp=gt
+ version_test_gt_a="$1"
+ version_test_gt_b="$2"
+
if [ "x$version_test_gt_b" = "x" ] ; then
return 0
fi
case "$version_test_gt_a:$version_test_gt_b" in
*.old:*.old) ;;
- *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;;
- *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;;
+ *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ;;
+ *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ;;
esac
- version_test_numeric "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b"
- return "$?"
+
+ if [ "$version_test_gt_a" = "$version_test_gt_b" ]; then
+ return 1;
+ fi
+
+ if [ x"$SORT" = x ]; then
+ if command -v rpmdev-vercmp >/dev/null; then
+ SORT=sort_rpm
+ elif command -v dpkg >/dev/null; then
+ SORT=sort_dpkg
+ elif sort -V </dev/null > /dev/null 2>&1; then
+ SORT=sort_V
+ else
+ SORT=sort_n
+ fi
+ fi
+ $SORT "$version_test_gt_a" "$version_test_gt_b"
}
version_find_latest ()
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] mkconfig: use distro sorts when available
2022-01-20 16:45 ` [PATCH v2 2/2] mkconfig: use distro sorts when available Robbie Harwood
@ 2022-01-20 19:00 ` Glenn Washburn
2022-01-20 22:07 ` Didier Spaier
1 sibling, 0 replies; 6+ messages in thread
From: Glenn Washburn @ 2022-01-20 19:00 UTC (permalink / raw)
To: Robbie Harwood; +Cc: grub-devel
On Thu, 20 Jan 2022 11:45:23 -0500
Robbie Harwood <rharwood@redhat.com> wrote:
> For Debian-likes and Fedora-likes, use the distribution's sorting tools
> to determine the latest package before falling back to sort(1). While
> Fedora's rpmdev-vercmp(1) is likely unavailable, Debian's is built into
> dpkg itself, and hence likely present.
>
> Refactor to remove unused code and make it easy to add other package
> managers as needed.
>
> Signed-off-by: Robbie Harwood <rharwood@redhat.com>
> ---
> util/grub-mkconfig_lib.in | 90 +++++++++++++++++++++------------------
> 1 file changed, 49 insertions(+), 41 deletions(-)
>
> diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
> index 23d41475f..cc0ab790e 100644
> --- a/util/grub-mkconfig_lib.in
> +++ b/util/grub-mkconfig_lib.in
> @@ -200,62 +200,70 @@ grub_file_is_not_garbage ()
> return 0
> }
>
> -version_sort ()
> +# A $SORT function returns 0 if $1 is newer than $2, and 1 otherwise. Other
> +# package managers can be plugged in here as needed with their own functions.
> +sort_dpkg ()
> {
> - case $version_sort_sort_has_v in
> - yes)
> - LC_ALL=C sort -V;;
> - no)
> - LC_ALL=C sort -n;;
> - *)
> - if sort -V </dev/null > /dev/null 2>&1; then
> - version_sort_sort_has_v=yes
> - LC_ALL=C sort -V
> - else
> - version_sort_sort_has_v=no
> - LC_ALL=C sort -n
> - fi;;
> - esac
> + left="`echo "$1" | sed -e "s/^[^0-9]*//"`"
> + right="`echo "$2" | sed -e "s/^[^0-9]*//"`"
> + dpkg --compare-versions "$left" gt "$right"
> }
>
> -version_test_numeric ()
> +sort_rpm ()
> {
> - version_test_numeric_a="$1"
> - version_test_numeric_cmp="$2"
> - version_test_numeric_b="$3"
> - if [ "$version_test_numeric_a" = "$version_test_numeric_b" ] ; then
> - case "$version_test_numeric_cmp" in
> - ge|eq|le) return 0 ;;
> - gt|lt) return 1 ;;
> - esac
> - fi
> - if [ "$version_test_numeric_cmp" = "lt" ] ; then
> - version_test_numeric_c="$version_test_numeric_a"
> - version_test_numeric_a="$version_test_numeric_b"
> - version_test_numeric_b="$version_test_numeric_c"
> - fi
> - if (echo "$version_test_numeric_a" ; echo "$version_test_numeric_b") | version_sort | head -n 1 | grep -qx "$version_test_numeric_b" ; then
> - return 0
> - else
> - return 1
> + left="`echo "$1" | sed -e "s/^[^0-9]*//"`"
> + right="`echo "$2" | sed -e "s/^[^0-9]*//"`"
> + rpmdev-vercmp "$left" "$right" >/dev/null
> + if [ $? -eq 12 ]; then
> + return 0;
> fi
> + return 1;
> +}
> +
> +sort_V ()
> +{
> + left="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> + right="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> + printf "$left\n$right\n" | LC_ALL=C sort -V | head -n1 | grep -qx "$right"
> +}
> +
> +sort_n ()
> +{
> + left="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> + right="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> + printf "$left\n$right\n" | LC_ALL=C sort -n | head -n1 | grep -qx "$right"
> }
>
> version_test_gt ()
> {
> - version_test_gt_a="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> - version_test_gt_b="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> - version_test_gt_cmp=gt
> + version_test_gt_a="$1"
> + version_test_gt_b="$2"
> +
> if [ "x$version_test_gt_b" = "x" ] ; then
> return 0
> fi
> case "$version_test_gt_a:$version_test_gt_b" in
> *.old:*.old) ;;
> - *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;;
> - *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;;
> + *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ;;
> + *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ;;
> esac
> - version_test_numeric "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b"
> - return "$?"
> +
> + if [ "$version_test_gt_a" = "$version_test_gt_b" ]; then
> + return 1;
> + fi
> +
> + if [ x"$SORT" = x ]; then
> + if command -v rpmdev-vercmp >/dev/null; then
> + SORT=sort_rpm
> + elif command -v dpkg >/dev/null; then
> + SORT=sort_dpkg
Sorry if I was not clear, my previous comment was suggesting to add
the above clauses below the existing clauses. So it would look like:
if [ -f /etc/debian_version ] && command -v dpkg >/dev/nul; then
SORT=sort_dpkg
elif [ -f /etc/redhat-release ] && command -v rpmdev-vercmp >/dev/null; then
SORT=sort_rpm
elif command -v rpmdev-vercmp >/dev/null; then
SORT=sort_rpm
elif command -v dpkg >/dev/null; then
SORT=sort_dpkg
The idea is if /etc/debian_version exists, you definitely want to use
dpkg, and likewise if /etc/redhat-release exists, you definitely want
to use rpmdev-vercmp. As a fallback, if either dpkg or rpmdev-vercmp
exists, use them as they are preferable to the crude sort method. And
as a last resort fallback to the sort methods.
> + elif sort -V </dev/null > /dev/null 2>&1; then
> + SORT=sort_V
> + else
> + SORT=sort_n
> + fi
> + fi
> + $SORT "$version_test_gt_a" "$version_test_gt_b"
> }
>
> version_find_latest ()
Glenn
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] mkconfig: use distro sorts when available
2022-01-20 16:45 ` [PATCH v2 2/2] mkconfig: use distro sorts when available Robbie Harwood
2022-01-20 19:00 ` Glenn Washburn
@ 2022-01-20 22:07 ` Didier Spaier
2022-01-21 4:05 ` Glenn Washburn
1 sibling, 1 reply; 6+ messages in thread
From: Didier Spaier @ 2022-01-20 22:07 UTC (permalink / raw)
To: grub-devel
Hi Robbie and All,
Do i understand correctly that this will not change anything for distributions
(like Slint, based on Slackware, that I maintain) that are neither Debian-likes
nor Fedora-likes?
Cheers,
Didier
Le 20/01/2022 à 17:45, Robbie Harwood a écrit :
> For Debian-likes and Fedora-likes, use the distribution's sorting tools
> to determine the latest package before falling back to sort(1). While
> Fedora's rpmdev-vercmp(1) is likely unavailable, Debian's is built into
> dpkg itself, and hence likely present.
>
> Refactor to remove unused code and make it easy to add other package
> managers as needed.
>
> Signed-off-by: Robbie Harwood <rharwood@redhat.com>
> ---
> util/grub-mkconfig_lib.in | 90 +++++++++++++++++++++------------------
> 1 file changed, 49 insertions(+), 41 deletions(-)
>
> diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
> index 23d41475f..cc0ab790e 100644
> --- a/util/grub-mkconfig_lib.in
> +++ b/util/grub-mkconfig_lib.in
> @@ -200,62 +200,70 @@ grub_file_is_not_garbage ()
> return 0
> }
>
> -version_sort ()
> +# A $SORT function returns 0 if $1 is newer than $2, and 1 otherwise. Other
> +# package managers can be plugged in here as needed with their own functions.
> +sort_dpkg ()
> {
> - case $version_sort_sort_has_v in
> - yes)
> - LC_ALL=C sort -V;;
> - no)
> - LC_ALL=C sort -n;;
> - *)
> - if sort -V </dev/null > /dev/null 2>&1; then
> - version_sort_sort_has_v=yes
> - LC_ALL=C sort -V
> - else
> - version_sort_sort_has_v=no
> - LC_ALL=C sort -n
> - fi;;
> - esac
> + left="`echo "$1" | sed -e "s/^[^0-9]*//"`"
> + right="`echo "$2" | sed -e "s/^[^0-9]*//"`"
> + dpkg --compare-versions "$left" gt "$right"
> }
>
> -version_test_numeric ()
> +sort_rpm ()
> {
> - version_test_numeric_a="$1"
> - version_test_numeric_cmp="$2"
> - version_test_numeric_b="$3"
> - if [ "$version_test_numeric_a" = "$version_test_numeric_b" ] ; then
> - case "$version_test_numeric_cmp" in
> - ge|eq|le) return 0 ;;
> - gt|lt) return 1 ;;
> - esac
> - fi
> - if [ "$version_test_numeric_cmp" = "lt" ] ; then
> - version_test_numeric_c="$version_test_numeric_a"
> - version_test_numeric_a="$version_test_numeric_b"
> - version_test_numeric_b="$version_test_numeric_c"
> - fi
> - if (echo "$version_test_numeric_a" ; echo "$version_test_numeric_b") | version_sort | head -n 1 | grep -qx "$version_test_numeric_b" ; then
> - return 0
> - else
> - return 1
> + left="`echo "$1" | sed -e "s/^[^0-9]*//"`"
> + right="`echo "$2" | sed -e "s/^[^0-9]*//"`"
> + rpmdev-vercmp "$left" "$right" >/dev/null
> + if [ $? -eq 12 ]; then
> + return 0;
> fi
> + return 1;
> +}
> +
> +sort_V ()
> +{
> + left="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> + right="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> + printf "$left\n$right\n" | LC_ALL=C sort -V | head -n1 | grep -qx "$right"
> +}
> +
> +sort_n ()
> +{
> + left="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> + right="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> + printf "$left\n$right\n" | LC_ALL=C sort -n | head -n1 | grep -qx "$right"
> }
>
> version_test_gt ()
> {
> - version_test_gt_a="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> - version_test_gt_b="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> - version_test_gt_cmp=gt
> + version_test_gt_a="$1"
> + version_test_gt_b="$2"
> +
> if [ "x$version_test_gt_b" = "x" ] ; then
> return 0
> fi
> case "$version_test_gt_a:$version_test_gt_b" in
> *.old:*.old) ;;
> - *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;;
> - *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;;
> + *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ;;
> + *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ;;
> esac
> - version_test_numeric "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b"
> - return "$?"
> +
> + if [ "$version_test_gt_a" = "$version_test_gt_b" ]; then
> + return 1;
> + fi
> +
> + if [ x"$SORT" = x ]; then
> + if command -v rpmdev-vercmp >/dev/null; then
> + SORT=sort_rpm
> + elif command -v dpkg >/dev/null; then
> + SORT=sort_dpkg
> + elif sort -V </dev/null > /dev/null 2>&1; then
> + SORT=sort_V
> + else
> + SORT=sort_n
> + fi
> + fi
> + $SORT "$version_test_gt_a" "$version_test_gt_b"
> }
>
> version_find_latest ()
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] mkconfig: use distro sorts when available
2022-01-20 22:07 ` Didier Spaier
@ 2022-01-21 4:05 ` Glenn Washburn
0 siblings, 0 replies; 6+ messages in thread
From: Glenn Washburn @ 2022-01-21 4:05 UTC (permalink / raw)
To: Didier Spaier; +Cc: The development of GNU GRUB
On Thu, 20 Jan 2022 23:07:10 +0100
Didier Spaier <didier@slint.fr> wrote:
> Hi Robbie and All,
>
> Do i understand correctly that this will not change anything for distributions
> (like Slint, based on Slackware, that I maintain) that are neither Debian-likes
> nor Fedora-likes?
It shouldn't change anything in the sense that you as a maintainer need
to do anything. At worst, it should fall back to the current bahavior
with a slight improvement. If Slint/Slack has dpkg or rpmdev-vercmp
installed, those will be used to do the version comparison. This should
be better than the current case, unless the Slint/Slack versioning
scheme is radically different than what those packages expect.
Glenn
>
> Cheers,
> Didier
>
> Le 20/01/2022 à 17:45, Robbie Harwood a écrit :
> > For Debian-likes and Fedora-likes, use the distribution's sorting tools
> > to determine the latest package before falling back to sort(1). While
> > Fedora's rpmdev-vercmp(1) is likely unavailable, Debian's is built into
> > dpkg itself, and hence likely present.
> >
> > Refactor to remove unused code and make it easy to add other package
> > managers as needed.
> >
> > Signed-off-by: Robbie Harwood <rharwood@redhat.com>
> > ---
> > util/grub-mkconfig_lib.in | 90 +++++++++++++++++++++------------------
> > 1 file changed, 49 insertions(+), 41 deletions(-)
> >
> > diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
> > index 23d41475f..cc0ab790e 100644
> > --- a/util/grub-mkconfig_lib.in
> > +++ b/util/grub-mkconfig_lib.in
> > @@ -200,62 +200,70 @@ grub_file_is_not_garbage ()
> > return 0
> > }
> >
> > -version_sort ()
> > +# A $SORT function returns 0 if $1 is newer than $2, and 1 otherwise. Other
> > +# package managers can be plugged in here as needed with their own functions.
> > +sort_dpkg ()
> > {
> > - case $version_sort_sort_has_v in
> > - yes)
> > - LC_ALL=C sort -V;;
> > - no)
> > - LC_ALL=C sort -n;;
> > - *)
> > - if sort -V </dev/null > /dev/null 2>&1; then
> > - version_sort_sort_has_v=yes
> > - LC_ALL=C sort -V
> > - else
> > - version_sort_sort_has_v=no
> > - LC_ALL=C sort -n
> > - fi;;
> > - esac
> > + left="`echo "$1" | sed -e "s/^[^0-9]*//"`"
> > + right="`echo "$2" | sed -e "s/^[^0-9]*//"`"
> > + dpkg --compare-versions "$left" gt "$right"
> > }
> >
> > -version_test_numeric ()
> > +sort_rpm ()
> > {
> > - version_test_numeric_a="$1"
> > - version_test_numeric_cmp="$2"
> > - version_test_numeric_b="$3"
> > - if [ "$version_test_numeric_a" = "$version_test_numeric_b" ] ; then
> > - case "$version_test_numeric_cmp" in
> > - ge|eq|le) return 0 ;;
> > - gt|lt) return 1 ;;
> > - esac
> > - fi
> > - if [ "$version_test_numeric_cmp" = "lt" ] ; then
> > - version_test_numeric_c="$version_test_numeric_a"
> > - version_test_numeric_a="$version_test_numeric_b"
> > - version_test_numeric_b="$version_test_numeric_c"
> > - fi
> > - if (echo "$version_test_numeric_a" ; echo "$version_test_numeric_b") | version_sort | head -n 1 | grep -qx "$version_test_numeric_b" ; then
> > - return 0
> > - else
> > - return 1
> > + left="`echo "$1" | sed -e "s/^[^0-9]*//"`"
> > + right="`echo "$2" | sed -e "s/^[^0-9]*//"`"
> > + rpmdev-vercmp "$left" "$right" >/dev/null
> > + if [ $? -eq 12 ]; then
> > + return 0;
> > fi
> > + return 1;
> > +}
> > +
> > +sort_V ()
> > +{
> > + left="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> > + right="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> > + printf "$left\n$right\n" | LC_ALL=C sort -V | head -n1 | grep -qx "$right"
> > +}
> > +
> > +sort_n ()
> > +{
> > + left="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> > + right="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> > + printf "$left\n$right\n" | LC_ALL=C sort -n | head -n1 | grep -qx "$right"
> > }
> >
> > version_test_gt ()
> > {
> > - version_test_gt_a="`echo "$1" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> > - version_test_gt_b="`echo "$2" | sed -e "s/[^-]*-//" -e "s/_/-/g"`"
> > - version_test_gt_cmp=gt
> > + version_test_gt_a="$1"
> > + version_test_gt_b="$2"
> > +
> > if [ "x$version_test_gt_b" = "x" ] ; then
> > return 0
> > fi
> > case "$version_test_gt_a:$version_test_gt_b" in
> > *.old:*.old) ;;
> > - *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;;
> > - *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;;
> > + *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ;;
> > + *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ;;
> > esac
> > - version_test_numeric "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b"
> > - return "$?"
> > +
> > + if [ "$version_test_gt_a" = "$version_test_gt_b" ]; then
> > + return 1;
> > + fi
> > +
> > + if [ x"$SORT" = x ]; then
> > + if command -v rpmdev-vercmp >/dev/null; then
> > + SORT=sort_rpm
> > + elif command -v dpkg >/dev/null; then
> > + SORT=sort_dpkg
> > + elif sort -V </dev/null > /dev/null 2>&1; then
> > + SORT=sort_V
> > + else
> > + SORT=sort_n
> > + fi
> > + fi
> > + $SORT "$version_test_gt_a" "$version_test_gt_b"
> > }
> >
> > version_find_latest ()
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-01-21 4:07 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-20 16:45 [PATCH v2 0/2] Improve kernel sorting in grub-mkconfig Robbie Harwood
2022-01-20 16:45 ` [PATCH v2 1/2] Correct sorting of kernel names containing '_' Robbie Harwood
2022-01-20 16:45 ` [PATCH v2 2/2] mkconfig: use distro sorts when available Robbie Harwood
2022-01-20 19:00 ` Glenn Washburn
2022-01-20 22:07 ` Didier Spaier
2022-01-21 4:05 ` Glenn Washburn
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.