2018-09-16 21:15:49

by Thomas Weißschuh

[permalink] [raw]
Subject: [PATCH] scripts/spdxcheck.py: improve Python 3 compat

When reading lines from a text-mode fd strings are returned.
These can not be decoded again into strings, breaking the logic in
parser.
Just make sure all files are opened in binary mode on Python 3, so the
current logic keeps working.

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

Signed-off-by: Thomas Weißschuh <[email protected]>
---
scripts/spdxcheck.py | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/scripts/spdxcheck.py b/scripts/spdxcheck.py
index 839e190bbd7a..8f472f995d70 100755
--- a/scripts/spdxcheck.py
+++ b/scripts/spdxcheck.py
@@ -250,12 +250,15 @@ if __name__ == '__main__':

try:
if len(args.path) and args.path[0] == '-':
- parser.parse_lines(sys.stdin, args.maxlines, '-')
+ parser.parse_lines(
+ # always get the binary fd
+ getattr(sys.stdin, 'buffer', sys.stdin),
+ args.maxlines, '-')
else:
if args.path:
for p in args.path:
if os.path.isfile(p):
- parser.parse_lines(open(p), args.maxlines, p)
+ parser.parse_lines(open(p, 'rb'), args.maxlines, p)
elif os.path.isdir(p):
scan_git_subtree(repo.head.reference.commit.tree, p)
else:
--
2.18.0



2018-09-17 15:40:54

by Jeremy Cline

[permalink] [raw]
Subject: Re: [PATCH] scripts/spdxcheck.py: improve Python 3 compat

On 09/16/2018 05:12 PM, Thomas Weißschuh wrote:
> When reading lines from a text-mode fd strings are returned.
> These can not be decoded again into strings, breaking the logic in
> parser.
> Just make sure all files are opened in binary mode on Python 3, so the
> current logic keeps working.
>
> This remains compatible with Python 2 and should have no functional
> change.
>
> Signed-off-by: Thomas Weißschuh <[email protected]>
> ---
> scripts/spdxcheck.py | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/scripts/spdxcheck.py b/scripts/spdxcheck.py
> index 839e190bbd7a..8f472f995d70 100755
> --- a/scripts/spdxcheck.py
> +++ b/scripts/spdxcheck.py
> @@ -250,12 +250,15 @@ if __name__ == '__main__':
>
> try:
> if len(args.path) and args.path[0] == '-':
> - parser.parse_lines(sys.stdin, args.maxlines, '-')
> + parser.parse_lines(
> + # always get the binary fd
> + getattr(sys.stdin, 'buffer', sys.stdin),
> + args.maxlines, '-')

I think a slightly more "Pythonic" way to do this would be:

try:
parser.parse_lines(sys.stdin.buffer, args.maxlines, '-')
except AttributeError:
# Python 2 doesn't have a binary buffer interface on stdin
parser.parse_lines(sys.stdin, args.maxlines, '-')

but they're equivalent so it's completely personal preference.

> else:
> if args.path:
> for p in args.path:
> if os.path.isfile(p):
> - parser.parse_lines(open(p), args.maxlines, p)
> + parser.parse_lines(open(p, 'rb'), args.maxlines, p)
> elif os.path.isdir(p):
> scan_git_subtree(repo.head.reference.commit.tree, p)
> else:
>

For what it's worth:

Reviewed-by: Jeremy Cline <[email protected]>