[PATCH v2 06/24] build-aux: rewrite duplicate header checker in Python

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



As part of an goal to eliminate Perl from libvirt build tools,
rewrite the prohibit-duplicate-header.pl tool in Python.

This was a straight conversion, manually going line-by-line to
change the syntax from Perl to Python. Thus the overall structure
of the file and approach is the same.

Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx>
---
 Makefile.am                            |  2 +-
 build-aux/prohibit-duplicate-header.pl | 26 -------------
 build-aux/prohibit-duplicate-header.py | 54 ++++++++++++++++++++++++++
 cfg.mk                                 |  4 +-
 4 files changed, 57 insertions(+), 29 deletions(-)
 delete mode 100644 build-aux/prohibit-duplicate-header.pl
 create mode 100644 build-aux/prohibit-duplicate-header.py

diff --git a/Makefile.am b/Makefile.am
index 8f688d40d0..a7d8da7146 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -47,7 +47,7 @@ EXTRA_DIST = \
   build-aux/header-ifdef.pl \
   build-aux/minimize-po.py \
   build-aux/mock-noinline.pl \
-  build-aux/prohibit-duplicate-header.pl \
+  build-aux/prohibit-duplicate-header.py \
   build-aux/useless-if-before-free \
   build-aux/vc-list-files \
   ci/Makefile \
diff --git a/build-aux/prohibit-duplicate-header.pl b/build-aux/prohibit-duplicate-header.pl
deleted file mode 100644
index 4a2ea65665..0000000000
--- a/build-aux/prohibit-duplicate-header.pl
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env perl
-
-use strict;
-
-my $file = " ";
-my $ret = 0;
-my %includes = ( );
-my $lineno = 0;
-
-while (<>) {
-    if (not $file eq $ARGV) {
-        %includes = ( );
-        $file = $ARGV;
-        $lineno = 0;
-    }
-    $lineno++;
-    if (/^# *include *[<"]([^>"]*\.h)[">]/) {
-        $includes{$1}++;
-        if ($includes{$1} == 2) {
-            $ret = 1;
-            print STDERR "$ARGV:$lineno: $_";
-            print STDERR "Do not include a header more than once per file\n";
-        }
-    }
-}
-exit $ret;
diff --git a/build-aux/prohibit-duplicate-header.py b/build-aux/prohibit-duplicate-header.py
new file mode 100644
index 0000000000..0ef86e8453
--- /dev/null
+++ b/build-aux/prohibit-duplicate-header.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2016-2019 Red Hat, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library.  If not, see
+# <http://www.gnu.org/licenses/>.
+
+from __future__ import print_function
+
+import re
+import sys
+
+def check_file(filename):
+    includes = {}
+    lineno = 0
+    errs = False
+    with open(filename, "r") as fh:
+        headerprog = re.compile(r'''^# *include *[<"]([^>"]*\.h)[">]\s*$''')
+        for line in fh:
+            lineno = lineno + 1
+
+            headermatch = headerprog.match(line)
+            if headermatch is not None:
+                inc = headermatch.group(1)
+
+                if inc in includes:
+                    print("%s:%d: %s" % (filename, lineno, inc), file=sys.stderr)
+                    errs = True
+                else:
+                    includes[inc] = True
+
+    return errs
+
+ret = 0
+
+for filename in sys.argv[1:]:
+    if check_file(filename):
+        ret = 1
+
+if ret == 1:
+    print("Do not include a header more than once per file", file=sys.stderr)
+
+sys.exit(ret)
diff --git a/cfg.mk b/cfg.mk
index d09ab507e0..933857bc2f 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -1147,8 +1147,8 @@ endif
 
 # Don't include duplicate header in the source (either *.c or *.h)
 prohibit-duplicate-header:
-	$(AM_V_GEN)$(VC_LIST_EXCEPT) | $(GREP) '\.[chx]$$' | xargs \
-	$(PERL) -W $(top_srcdir)/build-aux/prohibit-duplicate-header.pl
+	$(AM_V_GEN)$(VC_LIST_EXCEPT) | $(GREP) '\.[chx]$$' | $(RUNUTF8) xargs \
+	$(PYTHON) $(top_srcdir)/build-aux/prohibit-duplicate-header.py
 
 spacing-check:
 	$(AM_V_GEN)$(VC_LIST) | $(GREP) '\.c$$' | xargs \
-- 
2.21.0

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux