All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.