On 01/06/2016 03:28 PM, Petr Viktorin wrote:
> Hello,
> 
> Patches 0753-0757 fix remaining warnings from `pylint --py3k`, except
> "no-absolute-import" (which seems redundant to me) and the ones in
> contrib/RHEL4.

> The last patch adds py3k lint check  to make-lint. It's a bit
> cumbersome, since pylint doesn't allow running regular checkers and the
> py3k ones at the same time, but it allows you to run the check. As for
> whether to enable --py3k by default, or run it on every package build,
> I'd like to defer the decision to core devs. (Is CI good enough nowadays
> to only run it there?)
> 
> 
> [0] https://www.redhat.com/archives/freeipa-users/2013-July/msg00055.html

Here's a new version of the patchset, updated to current master.
The last patch requires 0758 (removing contrib/RHEL4) which is being
reviewed in another thread.

-- 
Petr Viktorin

From b9979f6fae741382d17f90381496819be86b9bee Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pvikt...@redhat.com>
Date: Tue, 5 Jan 2016 13:19:25 +0100
Subject: [PATCH] Use explicit truncating division

In Python 3, the truncating division operator, //, is needed to
get C-style "int division".
---
 ipalib/plugins/dns.py                    | 6 +++---
 ipalib/plugins/pwpolicy.py               | 4 ++--
 ipalib/plugins/trust.py                  | 2 +-
 ipaserver/install/ipa_otptoken_import.py | 4 ++--
 ipatests/test_integration/util.py        | 2 +-
 5 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/ipalib/plugins/dns.py b/ipalib/plugins/dns.py
index 59cb0ea3982256e9d98b8216207514e28e229d03..3b4b204d9640a4f130db687991cb35e18ab6e6e0 100644
--- a/ipalib/plugins/dns.py
+++ b/ipalib/plugins/dns.py
@@ -361,9 +361,9 @@ def _reverse_zone_name(netstr):
     net = netaddr.IPNetwork(netstr)
     items = net.ip.reverse_dns.split('.')
     if net.version == 4:
-        return u'.'.join(items[4 - net.prefixlen / 8:])
+        return u'.'.join(items[4 - net.prefixlen // 8:])
     elif net.version == 6:
-        return u'.'.join(items[32 - net.prefixlen / 4:])
+        return u'.'.join(items[32 - net.prefixlen // 4:])
     else:
         return None
 
@@ -3428,7 +3428,7 @@ class dnsrecord(LDAPObject):
         resolver = dns.resolver.Resolver()
         resolver.set_flags(0)  # disable recursion (for NS RR checks)
         max_attempts = int(self.api.env['wait_for_dns'])
-        warn_attempts = max_attempts / 2
+        warn_attempts = max_attempts // 2
         period = 1  # second
         attempt = 0
         log_fn = self.log.debug
diff --git a/ipalib/plugins/pwpolicy.py b/ipalib/plugins/pwpolicy.py
index 4710b48cc83a257d4f85f0de5c5e348f54d959fc..86c559b7dfeb7dffaa6c777876c6e65caab02075 100644
--- a/ipalib/plugins/pwpolicy.py
+++ b/ipalib/plugins/pwpolicy.py
@@ -380,11 +380,11 @@ class pwpolicy(LDAPObject):
         if not options.get('raw', False):
             if 'krbmaxpwdlife' in entry_attrs:
                 entry_attrs['krbmaxpwdlife'][0] = unicode(
-                    int(entry_attrs['krbmaxpwdlife'][0]) / 86400
+                    int(entry_attrs['krbmaxpwdlife'][0]) // 86400
                 )
             if 'krbminpwdlife' in entry_attrs:
                 entry_attrs['krbminpwdlife'][0] = unicode(
-                    int(entry_attrs['krbminpwdlife'][0]) / 3600
+                    int(entry_attrs['krbminpwdlife'][0]) // 3600
                 )
 
     def convert_time_on_input(self, entry_attrs):
diff --git a/ipalib/plugins/trust.py b/ipalib/plugins/trust.py
index bc347675aa36cd628b3e34fc7102028431b829c2..19d8b53fd0e4e413d289893ec9867c9c281d8fb2 100644
--- a/ipalib/plugins/trust.py
+++ b/ipalib/plugins/trust.py
@@ -396,7 +396,7 @@ def add_range(myapi, trustinstance, range_name, dom_sid, *keys, **options):
                 max_id = int(max(max_uid, max_gid)[0])
 
                 base_id = int(info.get('msSFU30OrderNumber')[0])
-                range_size = (1 + (max_id - base_id) / DEFAULT_RANGE_SIZE)\
+                range_size = (1 + (max_id - base_id) // DEFAULT_RANGE_SIZE)\
                              * DEFAULT_RANGE_SIZE
 
     # Second, options given via the CLI options take precedence to discovery
diff --git a/ipaserver/install/ipa_otptoken_import.py b/ipaserver/install/ipa_otptoken_import.py
index 8ea67fce144f5058ed152378bd677e3f937583eb..89cb2accc38495a96e0a4f20cfa0fff1b021dc30 100644
--- a/ipaserver/install/ipa_otptoken_import.py
+++ b/ipaserver/install/ipa_otptoken_import.py
@@ -246,9 +246,9 @@ class XMLDecryptor(object):
         # Decrypt the data.
         slot = nss.get_best_slot(mech)
         key = nss.import_sym_key(slot, mech, nss.PK11_OriginUnwrap, nss.CKA_ENCRYPT, self.__key)
-        iv = nss.param_from_iv(mech, nss.SecItem(data[0:ivlen/8]))
+        iv = nss.param_from_iv(mech, nss.SecItem(data[0:ivlen//8]))
         ctx = nss.create_context_by_sym_key(mech, nss.CKA_DECRYPT, key, iv)
-        out = ctx.cipher_op(data[ivlen / 8:])
+        out = ctx.cipher_op(data[ivlen // 8:])
         out += ctx.digest_final()
         return out
 
diff --git a/ipatests/test_integration/util.py b/ipatests/test_integration/util.py
index 5cfbb2e948c04c70e77b29fd3813ae3fb8a1b84c..594737b6d753d476cd06aeb0d5cd376b7ca46467 100644
--- a/ipatests/test_integration/util.py
+++ b/ipatests/test_integration/util.py
@@ -57,7 +57,7 @@ def run_repeatedly(host, command, assert_zero_rc=True, test=None,
     raise AssertionError("Command: {cmd} repeatedly failed {times} times, "
                          "exceeding the timeout of {timeout} seconds."
                          .format(cmd=' '.join(command),
-                                 times=timeout / time_step,
+                                 times=timeout // time_step,
                                  timeout=timeout))
 
 
-- 
2.5.0

From bbe51dfe11b2d03c27d404c8d294ffdb1de5e45a Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pvikt...@redhat.com>
Date: Tue, 5 Jan 2016 13:36:15 +0100
Subject: [PATCH] Don't index exceptions directly

In Python 3, exceptions don't behave as tuples of their arguments;
instead of e[1] it's necessary to use e.args[1].
---
 ipalib/cli.py           | 4 ++--
 ipalib/plugins/vault.py | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/ipalib/cli.py b/ipalib/cli.py
index 3b1b5a39371845d59bab07ac2fc32de598a469be..5398b7e7a8d5e0bfd72ef0638994968f8ae35c7c 100644
--- a/ipalib/cli.py
+++ b/ipalib/cli.py
@@ -1291,14 +1291,14 @@ class cli(backend.Executioner):
                     except IOError as e:
                         raise ValidationError(
                             name=to_cli(p.cli_name),
-                            error='%s: %s:' % (fname, e[1])
+                            error='%s: %s:' % (fname, e.args[1])
                         )
                 elif p.stdin_if_missing:
                     try:
                         raw = sys.stdin.read()
                     except IOError as e:
                         raise ValidationError(
-                            name=to_cli(p.cli_name), error=e[1]
+                            name=to_cli(p.cli_name), error=e.args[1]
                         )
 
                 if raw:
diff --git a/ipalib/plugins/vault.py b/ipalib/plugins/vault.py
index 0cf6f1d2447716a469c9c5626fffba97419d8fdb..4d8419e75770dc4c8b856560cf6c1613a132f8c0 100644
--- a/ipalib/plugins/vault.py
+++ b/ipalib/plugins/vault.py
@@ -221,7 +221,7 @@ def validated_read(argname, filename, mode='r', encoding=None):
         raise errors.ValidationError(
             name=argname,
             error=_("Cannot read file '%(filename)s': %(exc)s") % {
-                'filename': filename, 'exc': exc[1]
+                'filename': filename, 'exc': exc.args[1]
                 }
         )
     except UnicodeError as exc:
@@ -1547,7 +1547,7 @@ class vault_archive(PKQuery, Local):
             except OSError as exc:
                 raise errors.ValidationError(name="in", error=_(
                     "Cannot read file '%(filename)s': %(exc)s")
-                    % {'filename': input_file, 'exc': exc[1]})
+                    % {'filename': input_file, 'exc': exc.args[1]})
             if stat.st_size > MAX_VAULT_DATA_SIZE:
                 raise errors.ValidationError(name="in", error=_(
                     "Size of data exceeds the limit. Current vault data size "
-- 
2.5.0

From 8ceb2750b5d70dafc34830e2f4891f0f04fb75b9 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pvikt...@redhat.com>
Date: Tue, 5 Jan 2016 13:39:39 +0100
Subject: [PATCH] Use print_function future definition wherever print() is used

Pylint considers `print` a statement if the __future__ import is
not present, even if it's used like a function with one argument.

Add the __future__ import to files `pylint --py3k` complains about.
---
 doc/examples/python-api.py         | 1 +
 ipapython/dnssec/ldapkeydb.py      | 2 ++
 ipaserver/install/server/common.py | 2 ++
 3 files changed, 5 insertions(+)

diff --git a/doc/examples/python-api.py b/doc/examples/python-api.py
index 8c79dc4cac0c170a577ed1b5f90fa5f268401559..0a6eb60efa84102ce0571277c1698664b1865619 100755
--- a/doc/examples/python-api.py
+++ b/doc/examples/python-api.py
@@ -19,6 +19,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
+from __future__ import print_function
 from ipalib import api
 
 # 1. Initialize ipalib
diff --git a/ipapython/dnssec/ldapkeydb.py b/ipapython/dnssec/ldapkeydb.py
index b0b259f0ecb995a0eb49eedc732152fdb73cbf30..0ee30952549837f5f2bed0df85295c8200822d28 100644
--- a/ipapython/dnssec/ldapkeydb.py
+++ b/ipapython/dnssec/ldapkeydb.py
@@ -2,6 +2,8 @@
 # Copyright (C) 2014  FreeIPA Contributors see COPYING for license
 #
 
+from __future__ import print_function
+
 from binascii import hexlify
 import collections
 from pprint import pprint
diff --git a/ipaserver/install/server/common.py b/ipaserver/install/server/common.py
index 637e5664348bf3b7f2e4f2a867b8ecb224ccf388..277e839c3691a5ec8865684eedbfadf1984d7526 100644
--- a/ipaserver/install/server/common.py
+++ b/ipaserver/install/server/common.py
@@ -2,6 +2,8 @@
 # Copyright (C) 2015  FreeIPA Contributors see COPYING for license
 #
 
+from __future__ import print_function
+
 import os
 import sys
 
-- 
2.5.0

From f46af6f06459217ff9dbcecc99aa402c12b347f7 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pvikt...@redhat.com>
Date: Tue, 5 Jan 2016 13:54:43 +0100
Subject: [PATCH] Alias "unicode" to "str" under Python 3

Follow-up to commit 23507e6124041ed17f39db211e802495e37520e7

The six way of doing this is to replace all occurences of "unicode"
with "six.text_type". However, "unicode" is non-ambiguous and
(arguably) easier to read. Also, using it makes the patches smaller,
which should help with backporting.
---
 ipaserver/install/server/common.py                     | 5 +++++
 ipaserver/install/server/replicainstall.py             | 5 +++++
 ipatests/test_xmlrpc/test_caacl_profile_enforcement.py | 5 +++++
 ipatests/test_xmlrpc/test_certprofile_plugin.py        | 3 +++
 ipatests/test_xmlrpc/tracker/certprofile_plugin.py     | 4 ++++
 ipatests/test_xmlrpc/tracker/user_plugin.py            | 5 +++++
 6 files changed, 27 insertions(+)

diff --git a/ipaserver/install/server/common.py b/ipaserver/install/server/common.py
index 277e839c3691a5ec8865684eedbfadf1984d7526..8a9be92ee28d7b8e655198df309daab9c020e167 100644
--- a/ipaserver/install/server/common.py
+++ b/ipaserver/install/server/common.py
@@ -7,6 +7,8 @@ from __future__ import print_function
 import os
 import sys
 
+import six
+
 from ipapython.dn import DN
 from ipapython.install import common, core
 from ipapython.install.core import Knob
@@ -14,6 +16,9 @@ from ipalib.util import validate_domain_name
 from ipaserver.install import bindinstance
 from ipapython.ipautil import check_zone_overlap
 
+if six.PY3:
+    unicode = str
+
 VALID_SUBJECT_ATTRS = ['st', 'o', 'ou', 'dnqualifier', 'c',
                        'serialnumber', 'l', 'title', 'sn', 'givenname',
                        'initials', 'generationqualifier', 'dc', 'mail',
diff --git a/ipaserver/install/server/replicainstall.py b/ipaserver/install/server/replicainstall.py
index 150325b824ce055878791dc3039223342724684e..4bc1fd75ec08b7594120b7b3fa2edd4839168ddf 100644
--- a/ipaserver/install/server/replicainstall.py
+++ b/ipaserver/install/server/replicainstall.py
@@ -15,6 +15,8 @@ import socket
 import sys
 import tempfile
 
+import six
+
 from ipapython import ipaldap, ipautil, sysrestore
 from ipapython.dn import DN
 from ipapython.install.common import step
@@ -40,6 +42,9 @@ from binascii import hexlify
 
 from .common import BaseServer
 
+if six.PY3:
+    unicode = str
+
 DIRMAN_DN = DN(('cn', 'directory manager'))
 
 
diff --git a/ipatests/test_xmlrpc/test_caacl_profile_enforcement.py b/ipatests/test_xmlrpc/test_caacl_profile_enforcement.py
index 9de257a26f424ac00c24e06b15e604dedd5002bd..dca4151d614a4c2e2f5a09455426d117da4c1c80 100644
--- a/ipatests/test_xmlrpc/test_caacl_profile_enforcement.py
+++ b/ipatests/test_xmlrpc/test_caacl_profile_enforcement.py
@@ -7,6 +7,8 @@ import os
 import pytest
 import tempfile
 
+import six
+
 from ipalib import api, errors
 from ipatests.util import (
     prepare_config, unlock_principal_password, change_principal)
@@ -16,6 +18,9 @@ from ipatests.test_xmlrpc.tracker.caacl_plugin import CAACLTracker
 
 from ipapython.ipautil import run
 
+if six.PY3:
+    unicode = str
+
 BASE_DIR = os.path.dirname(__file__)
 
 SMIME_PROFILE_TEMPLATE = os.path.join(BASE_DIR, 'data/smime.cfg.tmpl')
diff --git a/ipatests/test_xmlrpc/test_certprofile_plugin.py b/ipatests/test_xmlrpc/test_certprofile_plugin.py
index 66a72de3e0da346289d9a8aa8eda039b6d6ddebc..e8459772d7a0b53b80b9cfa08a08dd57e4e12a47 100644
--- a/ipatests/test_xmlrpc/test_certprofile_plugin.py
+++ b/ipatests/test_xmlrpc/test_certprofile_plugin.py
@@ -10,12 +10,15 @@ Test the `ipalib.plugins.certprofile` module.
 import os
 
 import pytest
+import six
 
 from ipalib import api, errors
 from ipatests.util import prepare_config
 from ipatests.test_xmlrpc.xmlrpc_test import XMLRPC_test, raises_exact
 from ipatests.test_xmlrpc.tracker.certprofile_plugin import CertprofileTracker
 
+if six.PY3:
+    unicode = str
 
 IPA_CERT_SUBJ_BASE = (
     api.Command.config_show()
diff --git a/ipatests/test_xmlrpc/tracker/certprofile_plugin.py b/ipatests/test_xmlrpc/tracker/certprofile_plugin.py
index eeb27eb14a5ab77695264afb5770fb9218e56bd4..21c96c5eb36bfeacdcae9f1df61d2f6f4aafa7e9 100644
--- a/ipatests/test_xmlrpc/tracker/certprofile_plugin.py
+++ b/ipatests/test_xmlrpc/tracker/certprofile_plugin.py
@@ -5,12 +5,16 @@
 
 import os
 
+import six
 
 from ipapython.dn import DN
 from ipatests.test_xmlrpc.tracker.base import Tracker
 from ipatests.test_xmlrpc import objectclasses
 from ipatests.util import assert_deepequal
 
+if six.PY3:
+    unicode = str
+
 
 class CertprofileTracker(Tracker):
     """Tracker class for certprofile plugin.
diff --git a/ipatests/test_xmlrpc/tracker/user_plugin.py b/ipatests/test_xmlrpc/tracker/user_plugin.py
index bcae2ec787b3d3a54e34917f125be006094e07b0..2e042c60eaea330819dd7747a696d2ece7c87449 100644
--- a/ipatests/test_xmlrpc/tracker/user_plugin.py
+++ b/ipatests/test_xmlrpc/tracker/user_plugin.py
@@ -5,12 +5,17 @@
 from ipalib import api, errors
 from ipapython.dn import DN
 
+import six
+
 from ipatests.util import assert_deepequal, get_group_dn, get_user_dn
 from ipatests.test_xmlrpc import objectclasses
 from ipatests.test_xmlrpc.xmlrpc_test import (
     fuzzy_digits, fuzzy_uuid, raises_exact)
 from ipatests.test_xmlrpc.tracker.base import Tracker
 
+if six.PY3:
+    unicode = str
+
 
 class UserTracker(Tracker):
     """ Class for host plugin like tests """
-- 
2.5.0

From 1e98e4bcce58e93c12a7e8c4b6985f118c2ac72f Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pvikt...@redhat.com>
Date: Tue, 5 Jan 2016 13:57:51 +0100
Subject: [PATCH] Avoid builtins that were removed in Python 3

- `file` was removed in favor of `open`. Switch to the new spelling.
- `buffer` was removed in favor of a buffer protocol (and memoryview).
  It is used in a py2-only block so just placate PyLint.
- `long` and `int` were unified, but str(int(x)) does the same thing
  as str(long(x)) even on py2. Use the former.
---
 ipa-client/ipa-install/ipa-client-install | 2 +-
 ipalib/x509.py                            | 2 +-
 ipaplatform/redhat/tasks.py               | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/ipa-client/ipa-install/ipa-client-install b/ipa-client/ipa-install/ipa-client-install
index af8d27bd0da9b847fef917d3bcc2ebd1837c5fb0..81443fd23964cf71f5e2e30eb0ce41c1eee65a0d 100755
--- a/ipa-client/ipa-install/ipa-client-install
+++ b/ipa-client/ipa-install/ipa-client-install
@@ -1573,7 +1573,7 @@ def do_nsupdate(update_txt):
     root_logger.debug("Writing nsupdate commands to %s:", UPDATE_FILE)
     root_logger.debug("%s", update_txt)
 
-    update_fd = file(UPDATE_FILE, "w")
+    update_fd = open(UPDATE_FILE, "w")
     update_fd.write(update_txt)
     update_fd.flush()
     update_fd.close()
diff --git a/ipalib/x509.py b/ipalib/x509.py
index 886bf6af61c10b298e71ba1c605e8a3e7897611f..2d28876de6ba7963417ef1505558a1d7b52a429f 100644
--- a/ipalib/x509.py
+++ b/ipalib/x509.py
@@ -130,7 +130,7 @@ def load_certificate(data, datatype=PEM, dbdir=None):
     initialize_nss_database(dbdir=dbdir)
 
     if six.PY2:
-        return nss.Certificate(buffer(data))
+        return nss.Certificate(buffer(data))  # pylint: disable=buffer-builtin
     else:
         # In python 3 , `bytes` has the buffer interface
         return nss.Certificate(data)
diff --git a/ipaplatform/redhat/tasks.py b/ipaplatform/redhat/tasks.py
index a0b4060cb26bab66248c4397c24b4d58bf1bf8d6..dd7a7d6578ae0b895f2ed6f0c9e5668dd92e6339 100644
--- a/ipaplatform/redhat/tasks.py
+++ b/ipaplatform/redhat/tasks.py
@@ -56,7 +56,7 @@ def stringToVersion(verstring):
     i = verstring.find(':')
     if i != -1:
         try:
-            epoch = str(long(verstring[:i]))
+            epoch = str(int(verstring[:i]))
         except ValueError:
             # look, garbage in the epoch field, how fun, kill it
             epoch = '0' # this is our fallback, deal
-- 
2.5.0

From 62e3f6043eae214e2235830e15a73fa34de14520 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pvikt...@redhat.com>
Date: Tue, 5 Jan 2016 14:03:50 +0100
Subject: [PATCH] dnsutil: Rename __nonzero__ to __bool__

In Python 3, this special method got renamed. Set both to the same
function to keep compatibility.
---
 ipapython/dnsutil.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/ipapython/dnsutil.py b/ipapython/dnsutil.py
index a11d744d7131206cd0bb5d950c3725271b66410c..18141fa091b37c5e59a2efc1028812981bfd4884 100644
--- a/ipapython/dnsutil.py
+++ b/ipapython/dnsutil.py
@@ -49,11 +49,13 @@ class DNSName(dns.name.Name):
             # instead of a dns.exception
             raise dns.exception.SyntaxError(e)
 
-    def __nonzero__(self):
+    def __bool__(self):
         #dns.name.from_text('@') is represented like empty tuple
         #we need to acting '@' as nonzero value
         return True
 
+    __nonzero__ = __bool__  # for Python 2
+
     def __copy__(self):
         return DNSName(self.labels)
 
-- 
2.5.0

From c95dbd678b5a14afed393fa5e6c002d62094f1ad Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pvikt...@redhat.com>
Date: Tue, 5 Jan 2016 14:31:39 +0100
Subject: [PATCH] make-lint: Allow running pylint --py3k to detect Python3
 issues

Pylint can be run with the --py3k switch to detect porting issues.
This is not compatible with regular checking (i.e. to do all checks,
pylint must be run twice, with and without --py3k).

Add a --py3k switch to make-lint to do a py3 run.
Also add a --no-lint switch to allow only running the py3 checks.
---
 make-lint | 63 ++++++++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 38 insertions(+), 25 deletions(-)

diff --git a/make-lint b/make-lint
index 97b5cd0f92e19911dd59d7e6122be54c01ae2997..e78127c1d324585ecfce472630a8bf3ba0ca2e24 100755
--- a/make-lint
+++ b/make-lint
@@ -28,6 +28,7 @@ import os
 import sys
 from optparse import OptionParser
 from fnmatch import fnmatch, fnmatchcase
+import subprocess
 
 try:
     from pylint import checkers
@@ -222,6 +223,10 @@ def main():
         dest='fail', default=True, action='store_false')
     optparser.add_option('--enable-noerror', help='enable warnings and other non-error messages',
         dest='errors_only', default=True, action='store_false')
+    optparser.add_option('--py3k', help='Also check for Python 3 porting issues',
+        dest='py3k', default=False, action='store_true')
+    optparser.add_option('--no-lint', help='Skil the main lint check',
+        dest='do_lint', default=True, action='store_false')
 
     options, args = optparser.parse_args()
     cwd = os.getcwd()
@@ -310,33 +315,41 @@ def main():
     linter.set_option('persistent', False)
     linter.set_option('disable', 'python3')
 
-    linter.check(files)
+    if options.do_lint:
+        linter.check(files)
 
-    if linter.msg_status != 0:
-        print("""
-===============================================================================
-Errors were found during the static code check.
-""", file=sys.stderr)
-
-        if len(linter.missing) > 0:
-            print("There are some missing imports:", file=sys.stderr)
-            for mod in sorted(linter.missing):
-                print("    " + mod, file=sys.stderr)
+        if linter.msg_status != 0:
             print("""
-Please make sure all of the required and optional (python-gssapi, python-rhsm)
-python packages are installed.
-""", file=sys.stderr)
-
-        print("""\
-If you are certain that any of the reported errors are false positives, please
-mark them in the source code according to the pylint documentation.
-===============================================================================
-""", file=sys.stderr)
-
-    if options.fail:
-        return linter.msg_status
-    else:
-        return 0
+    ===============================================================================
+    Errors were found during the static code check.
+    """, file=sys.stderr)
+
+            if len(linter.missing) > 0:
+                print("There are some missing imports:", file=sys.stderr)
+                for mod in sorted(linter.missing):
+                    print("    " + mod, file=sys.stderr)
+                print("""
+    Please make sure all of the required and optional (python-gssapi, python-rhsm)
+    python packages are installed.
+    """, file=sys.stderr)
+
+            print("""\
+    If you are certain that any of the reported errors are false positives, please
+    mark them in the source code according to the pylint documentation.
+    ===============================================================================
+    """, file=sys.stderr)
+
+        if options.fail and linter.msg_status != 0:
+            return linter.msg_status
+
+    if options.py3k:
+        args = ['pylint', '--py3k', '-d', 'no-absolute-import']
+        args.extend(files)
+        returncode = subprocess.call(args)
+        if options.fail and returncode != 0:
+            return returncode
+
+    return 0
 
 if __name__ == "__main__":
     sys.exit(main())
-- 
2.5.0

-- 
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code

Reply via email to