rdiff-backup-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Rdiff-backup-commits] rdiff-backup CHANGELOG rdiff_backup/fs_abilitie..


From: Andrew Ferguson
Subject: [Rdiff-backup-commits] rdiff-backup CHANGELOG rdiff_backup/fs_abilitie...
Date: Tue, 14 Aug 2007 19:47:48 +0000

CVSROOT:        /sources/rdiff-backup
Module name:    rdiff-backup
Changes by:     Andrew Ferguson <owsla> 07/08/14 19:47:48

Modified files:
        .              : CHANGELOG 
        rdiff_backup   : fs_abilities.py 

Log message:
        New quoting logic to check for non-ASCII chars and Windows special 
chars independently.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/CHANGELOG?cvsroot=rdiff-backup&r1=1.245&r2=1.246
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/rdiff_backup/fs_abilities.py?cvsroot=rdiff-backup&r1=1.38&r2=1.39

Patches:
Index: CHANGELOG
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/CHANGELOG,v
retrieving revision 1.245
retrieving revision 1.246
diff -u -b -r1.245 -r1.246
--- CHANGELOG   14 Aug 2007 02:58:19 -0000      1.245
+++ CHANGELOG   14 Aug 2007 19:47:47 -0000      1.246
@@ -1,6 +1,9 @@
 New in v1.1.15 (????/??/??)
 ---------------------------
 
+Rewrite quoting logic to independently check for escaping Windows special
+characters, non-ASCII chars, and uppercase chars. (Andrew Ferguson)
+
 Permit Unicode log messages. (Andrew Ferguson)
 
 

Index: rdiff_backup/fs_abilities.py
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/rdiff_backup/fs_abilities.py,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -b -r1.38 -r1.39
--- rdiff_backup/fs_abilities.py        31 Jul 2007 14:51:14 -0000      1.38
+++ rdiff_backup/fs_abilities.py        14 Aug 2007 19:47:48 -0000      1.39
@@ -33,7 +33,8 @@
 
 class FSAbilities:
        """Store capabilities of given file system"""
-       extended_filenames = None # True if filenames can handle ":" etc.
+       extended_filenames = None # True if filenames can have non-ASCII chars
+       win_reserved_filenames = None # True if filenames can't have ",*,: etc.
        case_sensitive = None # True if "foobar" and "FoObAr" are different 
files
        ownership = None # True if chown works on this filesystem
        acls = None # True if access control lists supported
@@ -91,7 +92,9 @@
                                                           self.dir_inc_perms),
                                                          ('High-bit 
permissions', self.high_perms),
                                                          ('Symlink 
permissions', self.symlink_perms),
-                                                         ('Extended 
filenames', self.extended_filenames)])
+                                                         ('Extended 
filenames', self.extended_filenames),
+                                                         ('Windows reserved 
filenames',
+                                                          
self.win_reserved_filenames)])
                add_boolean_list([('Access control lists', self.acls),
                                                  ('Extended attributes', 
self.eas),
                                                  ('Case sensitivity', 
self.case_sensitive),
@@ -141,6 +144,7 @@
                subdir.mkdir()
 
                self.set_extended_filenames(subdir)
+               self.set_win_reserved_filenames(subdir)
                self.set_case_sensitive_readwrite(subdir)
                self.set_ownership(subdir)
                self.set_hardlinks(subdir)
@@ -208,7 +212,7 @@
                ord_rp.delete()
 
                # Try a UTF-8 encoded character
-               extended_filename = ':\\ ' + chr(225) + chr(132) + chr(137)
+               extended_filename = 'uni' + chr(225) + chr(132) + chr(137)
                ext_rp = None
                try:
                        ext_rp = subdir.append(extended_filename)
@@ -230,6 +234,28 @@
                        else:
                                self.extended_filenames = 1
 
+       def set_win_reserved_filenames(self, subdir):
+               """Set self.win_reserved_filenames by trying to write a path"""
+               assert not self.read_only
+
+               # Try Windows reserved characters
+               win_reserved_filename = ':\\"'
+               win_rp = None
+               try:
+                       win_rp = subdir.append(win_reserved_filename)
+                       win_rp.touch()
+               except (IOError, OSError):
+                       if win_rp: assert not win_rp.lstat()
+                       self.win_reserved_filenames = 1
+               else:
+                       assert win_rp.lstat()
+                       try:
+                               win_rp.delete()
+                       except (IOError, OSError):
+                               self.win_reserved_filenames = 1
+                       else:
+                               self.win_reserved_filenames = 0
+
        def set_acls(self, rp):
                """Set self.acls based on rp.  Does not write.  Needs to be 
local"""
                assert Globals.local_connection is rp.conn
@@ -564,16 +590,21 @@
 
        def get_ctq_from_fsas(self):
                """Determine chars_to_quote just from filesystems, no ctq 
file"""
+               ctq = []
+
                if self.src_fsa.case_sensitive and not 
self.dest_fsa.case_sensitive:
+                       ctq.append("A-Z") # Quote upper case
+               if not self.dest_fsa.extended_filenames:
+                       ctq.append('\000-\037') # Quote 0 - 31
+                       ctq.append('\200-\377') # Quote non-ASCII characters 
0x80 - 0xFF
+               if self.dest_fsa.win_reserved_filenames:
                        if self.dest_fsa.extended_filenames:
-                               return "A-Z;" # Quote upper case and quoting 
char
-                       # Quote the following 0 - 31, ", *, /, :, <, >, ?, \, 
|, ;
-                       # Also quote uppercase A-Z
-                       else: return 'A-Z\000-\037\"*/:<>?\\\\|\177;'
+                               ctq.append('\000-\037') # Quote 0 - 31
+                       # Quote ", *, /, :, <, >, ?, \, |, and 127 (DEL)
+                       ctq.append('\"*/:<>?\\\\|\177')
 
-               if self.dest_fsa.extended_filenames:
-                       return "" # Don't quote anything
-               else: return '\000-\037\"*/:<>?\\\\|\177;'
+               if ctq: ctq.append(';') # Quote quoting char if quoting anything
+               return "".join(ctq)
 
        def compare_ctq_file(self, rbdir, suggested_ctq):
                """Compare ctq file with suggested result, return actual ctq"""




reply via email to

[Prev in Thread] Current Thread [Next in Thread]