From 55a4a7d925ab079617e74113d448f4540661e317 Mon Sep 17 00:00:00 2001 From: joshn Date: Thu, 4 Jun 2009 23:50:58 +0000 Subject: Gah. Fix unicode support for linux systems where the destination Python installation doesn't support unicode filenames. git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup/trunk@1057 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109 --- rdiff-backup/rdiff_backup/eas_acls.py | 14 ++++++++++---- rdiff-backup/rdiff_backup/metadata.py | 6 +++--- rdiff-backup/rdiff_backup/rpath.py | 19 ++++++++++++------- rdiff-backup/rdiff_backup/statistics.py | 6 +++--- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/rdiff-backup/rdiff_backup/eas_acls.py b/rdiff-backup/rdiff_backup/eas_acls.py index c0b550b..af57ef1 100644 --- a/rdiff-backup/rdiff_backup/eas_acls.py +++ b/rdiff-backup/rdiff_backup/eas_acls.py @@ -180,8 +180,11 @@ def Record2EA(record): raise metadata.ParsingError("Bad record beginning: " + first[:8]) filename = first[8:] if filename == '.': index = () - else: index = tuple(unicode(C.acl_unquote(encode(filename)), - 'utf-8').split('/')) + else: + unquoted_filename = C.acl_unquote(encode(filename)) + if Globals.use_unicode_paths: + unquoted_filename = unicode(unquoted_filename, 'utf-8') + index = tuple(unquoted_filename.split('/')) ea = ExtendedAttributes(index) for line in lines: @@ -556,8 +559,11 @@ def Record2ACL(record): raise metadata.ParsingError("Bad record beginning: "+ first_line) filename = first_line[8:] if filename == '.': index = () - else: index = tuple(unicode(C.acl_unquote(encode(filename)), - 'utf-8').split('/')) + else: + unquoted_filename = C.acl_unquote(encode(filename)) + if Globals.use_unicode_paths: + unquoted_filename = unicode(unquoted_filename, 'utf-8') + index = tuple(unquoted_filename.split('/')) return AccessControlLists(index, record[newline_pos:]) class ACLExtractor(EAExtractor): diff --git a/rdiff-backup/rdiff_backup/metadata.py b/rdiff-backup/rdiff_backup/metadata.py index 2e7031e..68b2cbc 100644 --- a/rdiff-backup/rdiff_backup/metadata.py +++ b/rdiff-backup/rdiff_backup/metadata.py @@ -376,17 +376,17 @@ class FlatFile: compress = 1 if mode == 'r': self.rp = rp_base - self.fileobj = rpath.UnicodeFile(self.rp.open("rb", compress)) + self.fileobj = rpath.MaybeUnicode(self.rp.open("rb", compress)) else: assert mode == 'w' if compress and check_path and not rp_base.isinccompressed(): def callback(rp): self.rp = rp - self.fileobj = rpath.UnicodeFile(rpath.MaybeGzip(rp_base, + self.fileobj = rpath.MaybeUnicode(rpath.MaybeGzip(rp_base, callback)) else: self.rp = rp_base assert not self.rp.lstat(), self.rp - self.fileobj = rpath.UnicodeFile(self.rp.open("wb", + self.fileobj = rpath.MaybeUnicode(self.rp.open("wb", compress = compress)) def write_record(self, record): diff --git a/rdiff-backup/rdiff_backup/rpath.py b/rdiff-backup/rdiff_backup/rpath.py index ed64cf0..8b0ecd4 100644 --- a/rdiff-backup/rdiff_backup/rpath.py +++ b/rdiff-backup/rdiff_backup/rpath.py @@ -1417,19 +1417,24 @@ class RPath(RORPath): write_win_acl(self, acl) self.data['win_acl'] = acl -class UnicodeFile: - """ Wraps a RPath and reads/writes unicode. """ +class MaybeUnicode: + """ Wraps a RPath and reads/writes unicode if Globals.use_unicode_paths is on. """ def __init__(self, fileobj): self.fileobj = fileobj def read(self, length = -1): - return unicode(self.fileobj.read(length), 'utf-8') + data = self.fileobj.read(length) + if Globals.use_unicode_paths: + data = unicode(data, 'utf-8') + return data def write(self, buf): - if type(buf) != unicode: - buf = unicode(buf, 'utf-8') - return self.fileobj.write(buf.encode('utf-8')) + if Globals.use_unicode_paths: + if type(buf) != unicode: + buf = unicode(buf, 'utf-8') + buf = buf.encode('utf-8') + return self.fileobj.write(buf) def close(self): return self.fileobj.close() @@ -1463,7 +1468,7 @@ class GzipFile(gzip.GzipFile): unicode with the filename.""" if mode and 'b' not in mode: mode += 'b' - if type(filename) != unicode: + if type(filename) != unicode and Globals.use_unicode_paths: filename = unicode(filename, 'utf-8') fileobj = open(filename, mode or 'rb') gzip.GzipFile.__init__(self, filename.encode('utf-8'), diff --git a/rdiff-backup/rdiff_backup/statistics.py b/rdiff-backup/rdiff_backup/statistics.py index 1df602a..50ba3be 100644 --- a/rdiff-backup/rdiff_backup/statistics.py +++ b/rdiff-backup/rdiff_backup/statistics.py @@ -219,13 +219,13 @@ class StatsObj: def write_stats_to_rp(self, rp): """Write statistics string to given rpath""" - fp = rpath.UnicodeFile(rp.open("wb")) + fp = rpath.MaybeUnicode(rp.open("wb")) fp.write(self.get_stats_string()) assert not fp.close() def read_stats_from_rp(self, rp): """Set statistics from rpath, return self for convenience""" - fp = rpath.UnicodeFile(rp.open("r")) + fp = rpath.MaybeUnicode(rp.open("r")) self.set_stats_from_string(fp.read()) fp.close() return self @@ -364,7 +364,7 @@ class FileStats: suffix = Globals.compression and 'data.gz' or 'data' cls._rp = increment.get_inc(rpbase, suffix, Time.curtime) assert not cls._rp.lstat() - cls._fileobj = rpath.UnicodeFile(cls._rp.open("wb", + cls._fileobj = rpath.MaybeUnicode(cls._rp.open("wb", compress = Globals.compression)) cls._line_sep = Globals.null_separator and '\0' or '\n' -- cgit v1.2.1