diff options
author | Holger Weiß <holger@zedat.fu-berlin.de> | 2011-06-06 17:06:16 +0200 |
---|---|---|
committer | Sol Jerome <sol.jerome@gmail.com> | 2011-06-14 12:36:46 -0500 |
commit | c55c7f92d4971eedd2e7eafa18e0cac424b637db (patch) | |
tree | 4f120fa75ace45cdf78fd44b1852694d004eb7ac /src | |
parent | b2e9d11b0dca1af6e0ce9a9f21558b35b35f5777 (diff) | |
download | bcfg2-c55c7f92d4971eedd2e7eafa18e0cac424b637db.tar.gz bcfg2-c55c7f92d4971eedd2e7eafa18e0cac424b637db.tar.bz2 bcfg2-c55c7f92d4971eedd2e7eafa18e0cac424b637db.zip |
Create non-ASCII diffs
The client now also transmits diffs of files which include non-US-ASCII
data (using the encoding setting from Options.py), unless they look like
binary files. In the past, non-ASCII files were transmitted as Base64
blobs.
In addition, "bcfg2 -I" no longer refuses to display non-ASCII diffs.
Resolves ticket #999.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Client/Frame.py | 3 | ||||
-rw-r--r-- | src/lib/Client/Tools/POSIX.py | 28 |
2 files changed, 21 insertions, 10 deletions
diff --git a/src/lib/Client/Frame.py b/src/lib/Client/Frame.py index 60d158eb1..57844ab19 100644 --- a/src/lib/Client/Frame.py +++ b/src/lib/Client/Frame.py @@ -5,6 +5,7 @@ installs entries, and generates statistics. __revision__ = '$Revision$' import logging +import sys import time import Bcfg2.Client.Tools @@ -29,7 +30,7 @@ def promptFilter(prompt, entries): try: # py3k compatibility try: - ans = raw_input(iprompt) + ans = raw_input(iprompt.encode(sys.stdout.encoding, 'replace')) except NameError: ans = input(iprompt) if ans in ['y', 'Y']: diff --git a/src/lib/Client/Tools/POSIX.py b/src/lib/Client/Tools/POSIX.py index 875db5ea7..862e0bc04 100644 --- a/src/lib/Client/Tools/POSIX.py +++ b/src/lib/Client/Tools/POSIX.py @@ -76,6 +76,21 @@ def normUid(entry): return False +def isString(strng, encoding): + """ + Returns true if the string contains no ASCII control characters + and can be decoded from the specified encoding. + """ + for char in strng: + if ord(char) < 9 or ord(char) > 13 and ord(char) < 32: + return False + try: + strng.decode(encoding) + return True + except: + return False + + class POSIX(Bcfg2.Client.Tools.Tool): """POSIX File support code.""" name = 'POSIX' @@ -458,12 +473,7 @@ class POSIX(Bcfg2.Client.Tools.Tool): # md5sum so it would be faster for big binary files contentStatus = content == tempdata if not contentStatus: - try: - content.decode('ascii') - isstring = True - except: - isstring = False - if tbin or not isstring: + if tbin or not isString(content, self.setup['encoding']): entry.set('current_bfile', binascii.b2a_base64(content)) nqtext = entry.get('qtext', '') nqtext += '\nBinary file, no printable diff' @@ -493,15 +503,15 @@ class POSIX(Bcfg2.Client.Tools.Tool): difflib.unified_diff(content.split('\n'), \ tempdata.split('\n'))]) try: - eudiff = udiff.encode('ascii') + dudiff = udiff.decode(self.setup['encoding']) except: - eudiff = "Binary file: no diff printed" + dudiff = "Binary file: no diff printed" nqtext = entry.get('qtext', '') if nqtext: nqtext += '\n' - nqtext += eudiff + nqtext += dudiff else: entry.set('current_bfile', binascii.b2a_base64(content)) nqtext = entry.get('qtext', '') |