support/check-uniq-files: support weird locales and filenames
PATCH 1/1 support/check-uniq-files: support weird locales and filenames
Currently, when a filename contains characters not representable in the user's locale, we fail hard, especially when the host python is python3.
This is because python2 and python3 handle encoding/decoding strings differently, with python3 presumable doing the right thing, but it breaks on some systems, while python2 presumable does the wrong thing, but it works everywhere. (Just joking, obviously...)
Part of the issue being that the csv reader in python2 is broken with UTF8.
We fix the issue by ditching the csv reader, and simply read the file in binary mode, manually partitionning the lines on the first comma.
Then, we use the binary-encoded (really, un-encoded) package names and filenames as values and keys, respectively.
Finally, for each filename of package we need to print, we try to decode them with the default s for the usser settings, but catch any decoding exception and fallback to dumping the raw, binary values. in that case.
Thanks a lot to Arnout for the live help doing this patch. :-)
--- support/scripts/check-uniq-files | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
support/scripts/check-uniq-files +13 -6
@@ -26,16 +26,23 @@ def main(): return False file_to_pkg = defaultdict(list) - with open(args.packages_file_list[0], 'r') as pkg_file_list: - r = csv.reader(pkg_file_list, delimiter=',') - for row in r: - pkg = row[0] - file = row[1] + with open(args.packages_file_list[0], 'rb') as pkg_file_list: + for line in pkg_file_list.readlines(): + pkg, _, file = line.rstrip(b'\n').partition(b',') file_to_pkg[file].append(pkg) for file in file_to_pkg: if len(file_to_pkg[file]) > 1: - sys.stderr.write(warn.format(args.type, file, file_to_pkg[file])) + # If possible, try to decode the binary strings with + # the default user's locale + try: + sys.stderr.write(warn.format(args.type, file.decode(), + [p.decode() for p in file_to_pkg[file]])) + except UnicodeDecodeError: + # ... but fallback to just dumping them raw if they + # contain non-representable chars + sys.stderr.write(warn.format(args.type, file, + file_to_pkg[file])) if __name__ == "__main__":
Signature · 1 line
2.14.1
Arnout Vandecappelle
AppliedPATCH 1/1 support/check-uniq-files: support weird locales and filenames
Quoted 21 lines · Yann E. MORIN
Currently, when a filename contains characters not representable in the user's locale, we fail hard, especially when the host python is python3.
This is because python2 and python3 handle encoding/decoding strings differently, with python3 presumable doing the right thing, but it breaks on some systems, while python2 presumable does the wrong thing, but it works everywhere. (Just joking, obviously...)
Part of the issue being that the csv reader in python2 is broken with UTF8.
We fix the issue by ditching the csv reader, and simply read the file in binary mode, manually partitionning the lines on the first comma.
Then, we use the binary-encoded (really, un-encoded) package names and filenames as values and keys, respectively.
Finally, for each filename of package we need to print, we try to decode them with the default s for the usser settings, but catch any decoding exception and fallback to dumping the raw, binary values. in that case.
Quoted 6 lines
Thanks a lot to Arnout for the live help doing this patch. :-)
Reported-by Jaap Crezee <[email protected]>Signed-off-by "Yann E. MORIN" <[email protected]>Cc Arnout Vandecappelle <[email protected]>Cc Jaap Crezee <[email protected]>
Applied to master, thanks. But I couldn't resist extended the commit log a
little more - it really was too short :-P
Regards,
Arnout
Quoted 39 lines
--- support/scripts/check-uniq-files | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)support/scripts/check-uniq-files +13
-6@@ -26,16 +26,23 @@ def main(): return False file_to_pkg = defaultdict(list) - with open(args.packages_file_list[0], 'r') as pkg_file_list: - r = csv.reader(pkg_file_list, delimiter=',') - for row in r: - pkg = row[0] - file = row[1] + with open(args.packages_file_list[0], 'rb') as pkg_file_list: + for line in pkg_file_list.readlines(): + pkg, _, file = line.rstrip(b'\n').partition(b',') file_to_pkg[file].append(pkg) for file in file_to_pkg: if len(file_to_pkg[file]) > 1: - sys.stderr.write(warn.format(args.type, file, file_to_pkg[file])) + # If possible, try to decode the binary strings with + # the default user's locale + try: + sys.stderr.write(warn.format(args.type, file.decode(), + [p.decode() for p in file_to_pkg[file]])) + except UnicodeDecodeError: + # ... but fallback to just dumping them raw if they + # contain non-representable chars + sys.stderr.write(warn.format(args.type, file, + file_to_pkg[file])) if __name__ == "__main__":
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
PATCH 1/1 support/check-uniq-files: support weird locales and filenames
Quoted 8 lines · Arnout Vandecappelle
Quoted 4 lines
Reported-by Jaap Crezee <[email protected]>Signed-off-by "Yann E. MORIN" <[email protected]>Cc Arnout Vandecappelle <[email protected]>Cc Jaap Crezee <[email protected]>Applied to master, thanks. But I couldn't resist extended the commit log a
little more - it really was too short :-P
Excellent guys, thank you.
I can confirm it works for me.
Are such patches expected to be applied to/merged on 2018.02.x as well?
regards,
Jaap Crezee
PATCH 1/1 support/check-uniq-files: support weird locales and filenames
Jaap, All,
On 2018-04-01 23:25 +0200, Jaap Crezee spake thusly:
Quoted 9 lines · Arnout Vandecappelle
Quoted 6 lines
Quoted 4 lines
Reported-by Jaap Crezee <[email protected]>Signed-off-by "Yann E. MORIN" <[email protected]>Cc Arnout Vandecappelle <[email protected]>Cc Jaap Crezee <[email protected]>Applied to master, thanks. But I couldn't resist extended the commit log a
little more - it really was too short :-PExcellent guys, thank you.
I can confirm it works for me.
OK, good to know, thanks for the feedback. :-)
Quoted 1 line
Are such patches expected to be applied to/merged on 2018.02.x as well?
Yeah, they will eventually trickle down to the LTS branch. But we presumably want to test-bench them a bit in master before doing the backport...
Regards,
Yann E. MORIN.
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------'
PATCH 1/1 support/check-uniq-files: support weird locales and filenames
In reply to Yann E. MORINQuoted 23 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Yann" == Yann E MORIN <[email protected]> writes:
Currently, when a filename contains characters not representable in the user's locale, we fail hard, especially when the host python is python3.
This is because python2 and python3 handle encoding/decoding strings differently, with python3 presumable doing the right thing, but it breaks on some systems, while python2 presumable does the wrong thing, but it works everywhere. (Just joking, obviously...)
Part of the issue being that the csv reader in python2 is broken with UTF8.
We fix the issue by ditching the csv reader, and simply read the file in binary mode, manually partitionning the lines on the first comma.
Then, we use the binary-encoded (really, un-encoded) package names and filenames as values and keys, respectively.
Finally, for each filename of package we need to print, we try to decode them with the default s for the usser settings, but catch any decoding exception and fallback to dumping the raw, binary values. in that case.
Quoted 6 lines
Thanks a lot to Arnout for the live help doing this patch. :-)
Reported-by Jaap Crezee <[email protected]>Signed-off-by "Yann E. MORIN" <[email protected]>Cc Arnout Vandecappelle <[email protected]>Cc Jaap Crezee <[email protected]>
Committed to 2018.02.x, thanks.
Signature · 1 line
Bye, Peter Korsgaard