about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--Functions/Misc/is-at-least20
2 files changed, 23 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 40e536a54..3e42cc91e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2015-12-19  Barton E. Schaefer  <schaefer@zsh.org>
 
+	* users/21082 (expanded): Functions/Misc/is-at-least: do a more
+	complete job of sorting version strings that are not in the form
+	of zsh version numbers; additional explanatory comment
+
 	* unposted (cf. 37387): Src/options.c: emulate turns off
 	WARN_CREATE_GLOBAL
 
diff --git a/Functions/Misc/is-at-least b/Functions/Misc/is-at-least
index d4b0e2fe0..d4ff3552a 100644
--- a/Functions/Misc/is-at-least
+++ b/Functions/Misc/is-at-least
@@ -13,10 +13,16 @@
 # is-at-least 3.1.0 && setopt HIST_REDUCE_BLANKS
 # is-at-least 586 $MACHTYPE && echo 'You could be running Mandrake!'
 # is-at-least $ZSH_VERSION || print 'Something fishy here.'
+#
+# Note that segments that contain no digits at all are ignored, and leading
+# text is discarded if trailing digits follow, because this was the meaning
+# of certain zsh version strings in the early 2000s.  Other segments that
+# begin with digits are compared using NUMERIC_GLOB_SORT semantics, and any
+# other segments starting with text are compared lexically.
 
 emulate -L zsh
 
-local IFS=".-" min_cnt=0 ver_cnt=0 part min_ver version
+local IFS=".-" min_cnt=0 ver_cnt=0 part min_ver version order
 
 min_ver=(${=1})
 version=(${=2:-$ZSH_VERSION} 0)
@@ -24,6 +30,18 @@ version=(${=2:-$ZSH_VERSION} 0)
 while (( $min_cnt <= ${#min_ver} )); do
   while [[ "$part" != <-> ]]; do
     (( ++ver_cnt > ${#version} )) && return 0
+    if [[ ${version[ver_cnt]} = *[0-9][^0-9]* ]]; then
+      # Contains a number followed by text.  Not a zsh version string.
+      order=( ${version[ver_cnt]} ${min_ver[ver_cnt]} )
+      if [[ ${version[ver_cnt]} = <->* ]]; then
+        # Leading digits, compare by sorting with numeric order.
+        [[ $order != ${${(On)order}} ]] && return 1
+      else
+        # No leading digits, compare by sorting in lexical order.
+        [[ $order != ${${(O)order}} ]] && return 1
+      fi
+      [[ $order[1] != $order[2] ]] && return 0
+    fi
     part=${version[ver_cnt]##*[^0-9]}
   done