build-many-glibcs: relax version check to allow non-digit characters

Message ID 20240131040201.470671-1-maskray@google.com
State Committed
Commit 0d70accc06a9cbb9b13004116f5fa8b1f41a7150
Headers
Series build-many-glibcs: relax version check to allow non-digit characters |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Testing passed
redhat-pt-bot/TryBot-32bit success Build for i686
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Testing passed

Commit Message

Fangrui Song Jan. 31, 2024, 4:02 a.m. UTC
  A version string may contain non-digit characters, commonly found in
built-from-VCS tools, e.g.
```
git version 2.39.GIT
git version 2.43.0.493.gbc7ee2e5e1
```

`int()` will raise a ValueError, leading to a spurious 'missing'.
---
 scripts/build-many-glibcs.py | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)
  

Comments

DJ Delorie Jan. 31, 2024, 9:42 p.m. UTC | #1
Fangrui Song <maskray@google.com> writes:
> A version string may contain non-digit characters, commonly found in
> built-from-VCS tools, e.g.

And we assume that these extra characters are not part of the
comparable, hopefully monotonically-increasing, portion of the version
number ;-)

> -def get_version_common(progname,line,word,delchars,arg1):
> +def get_version_common(progname,line,word,arg1):

Ok.

>          v = out.stdout.splitlines()[line].split()[word]
> -        if delchars:
> -            v = v.replace(delchars,'')
> +        v = re.match(r'[0-9]+(.[0-9]+)*', v).group()
>          return [int(x) for x in v.split('.')]

I confirmed that this will include the first number despite it not being
in ()'s.  Ok.

> -def get_version_common_stderr(progname,line,word,delchars,arg1):
> +def get_version_common_stderr(progname,line,word,arg1):

Ok.

> -        if delchars:
> -            v = v.replace(delchars,'')
> +        v = re.match(r'[0-9]+(.[0-9]+)*', v).group()

Ok.

>  def get_version(progname):
> -    return get_version_common (progname, 0, -1, None, '--version');
> +    return get_version_common(progname, 0, -1, '--version');
>  
>  def get_version_awk(progname):
> -    return get_version_common (progname, 0, 2, ',', '--version');
> +    return get_version_common(progname, 0, 2, '--version');
>  
>  def get_version_bzip2(progname):
> -    return get_version_common_stderr (progname, 0, 6, ',', '-h');
> +    return get_version_common_stderr(progname, 0, 6, '-h');

Ok.

LGTM.

Reviewed-by: DJ Delorie <dj@redhat.com>
  

Patch

diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py
index 784c80d132..84418e8de1 100755
--- a/scripts/build-many-glibcs.py
+++ b/scripts/build-many-glibcs.py
@@ -1888,7 +1888,7 @@  def get_parser():
     return parser
 
 
-def get_version_common(progname,line,word,delchars,arg1):
+def get_version_common(progname,line,word,arg1):
     try:
         out = subprocess.run([progname, arg1],
                              stdout=subprocess.PIPE,
@@ -1896,13 +1896,12 @@  def get_version_common(progname,line,word,delchars,arg1):
                              stdin=subprocess.DEVNULL,
                              check=True, universal_newlines=True)
         v = out.stdout.splitlines()[line].split()[word]
-        if delchars:
-            v = v.replace(delchars,'')
+        v = re.match(r'[0-9]+(.[0-9]+)*', v).group()
         return [int(x) for x in v.split('.')]
     except:
         return 'missing';
 
-def get_version_common_stderr(progname,line,word,delchars,arg1):
+def get_version_common_stderr(progname,line,word,arg1):
     try:
         out = subprocess.run([progname, arg1],
                              stdout=subprocess.DEVNULL,
@@ -1910,20 +1909,19 @@  def get_version_common_stderr(progname,line,word,delchars,arg1):
                              stdin=subprocess.DEVNULL,
                              check=True, universal_newlines=True)
         v = out.stderr.splitlines()[line].split()[word]
-        if delchars:
-            v = v.replace(delchars,'')
+        v = re.match(r'[0-9]+(.[0-9]+)*', v).group()
         return [int(x) for x in v.split('.')]
     except:
         return 'missing';
 
 def get_version(progname):
-    return get_version_common (progname, 0, -1, None, '--version');
+    return get_version_common(progname, 0, -1, '--version');
 
 def get_version_awk(progname):
-    return get_version_common (progname, 0, 2, ',', '--version');
+    return get_version_common(progname, 0, 2, '--version');
 
 def get_version_bzip2(progname):
-    return get_version_common_stderr (progname, 0, 6, ',', '-h');
+    return get_version_common_stderr(progname, 0, 6, '-h');
 
 def check_version(ver, req):
     for v, r in zip(ver, req):