[SCM] The rsync repository. - branch master updated

Rsync CVS commit messages rsync-cvs at lists.samba.org
Thu Apr 30 05:23:15 UTC 2020


The branch, master has been updated
       via  f7746d00 A couple extra function checks for future features.
       via  96a6ea0f Convert another packaging script to python3.
      from  62427861 A few superficial tweaks.

https://git.samba.org/?p=rsync.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f7746d0000ac5c72974ad90a8d746561dc8cd10a
Author: Wayne Davison <wayne at opencoder.net>
Date:   Wed Apr 29 22:14:49 2020 -0700

    A couple extra function checks for future features.

commit 96a6ea0f26886cfc427f852eca8321fbc9a7d055
Author: Wayne Davison <wayne at opencoder.net>
Date:   Wed Apr 29 21:24:26 2020 -0700

    Convert another packaging script to python3.

-----------------------------------------------------------------------

Summary of changes:
 configure.ac          |   1 +
 packaging/var-checker | 162 ++++++++++++++++++++++++++------------------------
 2 files changed, 84 insertions(+), 79 deletions(-)


Changeset truncated at 500 lines:

diff --git a/configure.ac b/configure.ac
index fef9004c..d4e95fb8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -598,6 +598,7 @@ AC_FUNC_UTIME_NULL
 AC_FUNC_ALLOCA
 AC_CHECK_FUNCS(waitpid wait4 getcwd strdup chown chmod lchmod mknod mkfifo \
     fchmod fstat ftruncate strchr readlink link utime utimes lutimes strftime \
+    chflags getattrlist \
     memmove lchown vsnprintf snprintf vasprintf asprintf setsid strpbrk \
     strlcat strlcpy strtol mallinfo getgroups setgroups geteuid getegid \
     setlocale setmode open64 lseek64 mkstemp64 mtrace va_copy __va_copy \
diff --git a/packaging/var-checker b/packaging/var-checker
index 7c017252..6b472f71 100755
--- a/packaging/var-checker
+++ b/packaging/var-checker
@@ -1,83 +1,87 @@
-#!/usr/bin/perl
+#!/usr/bin/python3 -B
+
 # This script checks the *.c files for extraneous "extern" variables,
 # for vars that are defined but not used, and for inconsistent array
 # sizes.  Run it from inside the main rsync directory.
 
-use strict;
-use warnings;
-
-my %add_syscall_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c tls.c trimslash.c );
-my %add_compat_c = map { $_ => 1 } qw( t_stub.c tls.c trimslash.c wildtest.c );
-my %add_util_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c );
-my %sizes;
-
-open(IN, '<', 'syscall.c') or die $!;
-undef $/; my $syscall_c = <IN>; $/ = "\n";
-close IN;
-$syscall_c =~ s/^extern\s.*//mg;
-
-open(IN, '<', 'lib/compat.c') or die $!;
-undef $/; my $compat_c = <IN>; $/ = "\n";
-close IN;
-$compat_c =~ s/^extern\s.*//mg;
-
-open(IN, '<', 'util.c') or die $!;
-undef $/; my $util_c = <IN>; $/ = "\n";
-close IN;
-$util_c =~ s/^extern\s.*//mg;
-
-my @files = glob('*.c');
-
-foreach my $fn (@files) {
-    open(IN, '<', $fn) or die $!;
-    undef $/; $_ = <IN>; $/ = "\n";
-    close IN;
-
-    my @vars = /^(?!(?:extern|enum)\s)([a-zA-Z]\S*\s+.*);/mg;
-    my @externs = /^extern\s+(.*);/mg;
-
-    $_ .= $syscall_c if $add_syscall_c{$fn};
-    $_ .= $compat_c if $add_compat_c{$fn};
-    $_ .= $util_c if $add_util_c{$fn};
-    s/INFO_GTE/info_levels/g;
-    s/DEBUG_GTE/debug_levels/g;
-
-    check_vars($fn, 'var', @vars);
-    check_vars($fn, 'extern', @externs);
-}
-
-exit;
-
-# The file's contents are in $_.
-sub check_vars
-{
-    my $fn = shift;
-    my $type = shift;
-
-    foreach my $line (@_) {
-	$line =~ s/\s*\{.*\}//;
-	$line =~ s/\s*\(.*\)//;
-	foreach my $item (split(/\s*,\s*/, $line)) {
-	    $item =~ s/\s*=.*//;
-	    my $sz = $item =~ s/(\[.*?\])// ? $1 : '';
-	    my($var) = $item =~ /([^*\s]+)$/;
-	    if (!defined $var) {
-		print "Bogus match? ($item)\n";
-		next;
-	    }
-	    if ($sz) {
-		if (defined $sizes{$var}) {
-		    if ($sizes{$var} ne $sz) {
-			print $fn, ' has inconsistent size for "', $var,
-			    "\": $sizes{$var} vs $sz\n";
-		    }
-		} else {
-		    $sizes{$var} = $sz;
-		}
-	    }
-	    my @matches = /(?<!\sstruct )\b(\Q$var\E)(?!\w)/g;
-	    push(@matches, /(\QSIGACTION(\E)/g) if $var eq 'sigact';
-	    print $fn, " has extraneous $type: \"", $var, "\"\n" if @matches == 1;
-	}
-    }
-}
+import re, argparse, glob
+
+VARS_RE = re.compile(r'^(?!(?:extern|enum)\s)([a-zA-Z]\S*\s+.*);', re.M)
+EXTERNS_RE = re.compile(r'^extern\s+(.*);', re.M)
+
+sizes = { }
+
+def main():
+    add_syscall_c = set('t_stub.c t_unsafe.c tls.c trimslash.c'.split())
+    add_util_c = set('t_stub.c t_unsafe.c'.split())
+
+    syscall_c = slurp_file('syscall.c', True)
+    util_c = slurp_file('util.c', True)
+
+    for fn in sorted(glob.glob('*.c')):
+        txt = slurp_file(fn)
+
+        var_list = parse_vars(fn, VARS_RE.findall(txt))
+        extern_list = parse_vars(fn, EXTERNS_RE.findall(txt))
+        if not var_list and not extern_list:
+            continue
+
+        if fn in add_syscall_c:
+            txt += syscall_c
+        if fn in add_util_c:
+            txt += util_c
+
+        txt = re.sub(r'INFO_GTE', 'info_levels ', txt)
+        txt = re.sub(r'DEBUG_GTE', 'debug_levels ', txt)
+        txt = re.sub(r'SIGACTION\(', 'sigact (', txt)
+
+        find = '|'.join([ re.escape(x) for x in var_list + extern_list ])
+        var_re = re.compile(r'(?<!\sstruct )\b(%s)(?!\w)' % find)
+
+        found = { x: 0 for x in var_list + extern_list }
+        for var in var_re.findall(txt):
+            found[var] += 1
+
+        for var in sorted(var_list + extern_list):
+            if found[var] == 1:
+                vtype = 'var' if var in var_list else 'extern'
+                print(fn, f'has extraneous {vtype}: "{var}"')
+
+
+def slurp_file(fn, drop_externs=False):
+    with open(fn, 'r', encoding='utf-8') as fh:
+        txt = fh.read()
+    if drop_externs:
+        txt = EXTERNS_RE.sub('', txt)
+    return txt
+
+
+def parse_vars(fn, lines):
+    ret = [ ]
+    for line in lines:
+        line = re.sub(r'\s*\{.*\}', '', line)
+        line = re.sub(r'\s*\(.*\)', '', line)
+        for item in re.split(r'\s*,\s*', line):
+            item = re.sub(r'\s*=.*', '', item)
+            m = re.search(r'(?P<var>\w+)(?P<sz>\[.*?\])?$', item)
+            if not m:
+                print(f"Bogus match? ({item})")
+                continue
+            if m['sz']:
+                if m['var'] in sizes:
+                    if sizes[m['var']] != m['sz']:
+                        var = m['var']
+                        print(fn, f'has inconsistent size for "{var}":', m['sz'], 'vs', sizes[var])
+                else:
+                    sizes[m['var']] = m['sz']
+            ret.append(m['var'])
+    return ret
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description='Check the *.c files for extraneous extern vars.', add_help=False)
+    parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.")
+    args = parser.parse_args()
+    main()
+
+# vim: sw=4 et


-- 
The rsync repository.



More information about the rsync-cvs mailing list