scripts: add Python 3 compatibility to spdxcheck.py

"dict.has_key(key)" on dictionaries has been replaced with "key in
dict".  Additionally, when run under Python 3 some files don't decode
with the default encoding (tested with UTF-8).  To handle that, don't
open the file in text mode and decode text line-by-line, ignoring
encoding errors.

This remains compatible with Python 2 and should have no functional
change.

Link: http://lkml.kernel.org/r/20180717190635.29467-1-jcline@redhat.com
Signed-off-by: Jeremy Cline <jcline@redhat.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Jeremy Cline 2018-08-17 15:44:01 -07:00 committed by Linus Torvalds
parent fde5e903fb
commit bed95c43c1

View File

@ -4,6 +4,7 @@
from argparse import ArgumentParser from argparse import ArgumentParser
from ply import lex, yacc from ply import lex, yacc
import locale
import traceback import traceback
import sys import sys
import git import git
@ -102,7 +103,7 @@ class id_parser(object):
raise ParserException(tok, 'Invalid License ID') raise ParserException(tok, 'Invalid License ID')
self.lastid = id self.lastid = id
elif tok.type == 'EXC': elif tok.type == 'EXC':
if not self.spdx.exceptions.has_key(id): if id not in self.spdx.exceptions:
raise ParserException(tok, 'Invalid Exception ID') raise ParserException(tok, 'Invalid Exception ID')
if self.lastid not in self.spdx.exceptions[id]: if self.lastid not in self.spdx.exceptions[id]:
raise ParserException(tok, 'Exception not valid for license %s' %self.lastid) raise ParserException(tok, 'Exception not valid for license %s' %self.lastid)
@ -167,6 +168,7 @@ class id_parser(object):
self.curline = 0 self.curline = 0
try: try:
for line in fd: for line in fd:
line = line.decode(locale.getpreferredencoding(False), errors='ignore')
self.curline += 1 self.curline += 1
if self.curline > maxlines: if self.curline > maxlines:
break break
@ -201,7 +203,8 @@ def scan_git_tree(tree):
continue continue
if not os.path.isfile(el.path): if not os.path.isfile(el.path):
continue continue
parser.parse_lines(open(el.path), args.maxlines, el.path) with open(el.path, 'rb') as fd:
parser.parse_lines(fd, args.maxlines, el.path)
def scan_git_subtree(tree, path): def scan_git_subtree(tree, path):
for p in path.strip('/').split('/'): for p in path.strip('/').split('/'):