summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoshn <joshn@2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109>2009-06-04 23:50:58 +0000
committerjoshn <joshn@2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109>2009-06-04 23:50:58 +0000
commit55a4a7d925ab079617e74113d448f4540661e317 (patch)
treecf7eb6eae3a08893702c4ca5bccd3198df25171e
parent2717ce34a4c17ad87b021a0a51be89164ef7a2c3 (diff)
downloadrdiff-backup-55a4a7d925ab079617e74113d448f4540661e317.tar.gz
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
-rw-r--r--rdiff-backup/rdiff_backup/eas_acls.py14
-rw-r--r--rdiff-backup/rdiff_backup/metadata.py6
-rw-r--r--rdiff-backup/rdiff_backup/rpath.py19
-rw-r--r--rdiff-backup/rdiff_backup/statistics.py6
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'