
OcIc           @   s  d  Z  d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k	 Z	 d d k
 Z
 d d k Z d f  d     YZ d   Z d f  d     YZ d e f d	     YZ d
 e f d     YZ d e f d     YZ d   Z d   Z e d  Z d S(   sh  Determine the capabilities of given file system

rdiff-backup needs to read and write to file systems with varying
abilities.  For instance, some file systems and not others have ACLs,
are case-sensitive, or can store ownership information.  The code in
this module tests the file system for various features, and returns an
FSAbilities object describing it.

iNt   FSAbilitiesc           B   sC  e  Z d  Z d Z d Z d Z d Z d Z d Z	 d Z
 d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z  d   Z! d   Z" d   Z# d   Z$ d   Z% d   Z& d   Z' d   Z( d   Z) d   Z* d   Z+ RS(   s'   Store capabilities of given file systemc         C   s   | |  _  d S(   s6   FSAbilities initializer.  name is only used in loggingN(   t   name(   t   selfR   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   __init__9   s    c            sw    i  d j p   i  d j p t   i   d d g   f d     f d   }   f d   }  i |      i  pn | d   i f d	   i f d
   i f d   i f d   i f d   i f d   i	 f d   i
 f g  n | d   i f d   i f d   i f d   i f d   i f d   i f d   i f d   i f g   i  d  d i   S(   s'   Return pretty printable version of selfi    i   t   -iA   c            s,     i  d |  d d t |   | f  d S(   s   Add description line to ss     %s%s%st    i-   N(   t   appendt   len(   t   desct   val_text(   t   s(    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   addlineB   s    c            sj   xc |  D][ \ } } | o
 d } n2 | d j o
 d } n | d j p t  d }   | |  q Wd S(   s,   Add lines from list of (desc, boolean) pairst   Ons   N/Ai    t   OffN(   t   Nonet   AssertionError(   t	   pair_listR   t   booleanR	   (   R   (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   add_boolean_listF   s      
 
c             sE     i  o d p d }    i o d   i |  f Sn d |  f Sd S(   s)   Add the first line, mostly for decorations	   read onlys
   read/writes+   Detected abilities for %s (%s) file system:s%   Detected abilities for %s file systemN(   t	   read_onlyR   (   t   read_string(   R   (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   get_title_lineP   s    
s   Ownership changings   Hard linkings   fsync() directoriess   Directory inc permissionss   High-bit permissionss   Symlink permissionss   Extended filenamess   Windows reserved filenamess   Access control listss   Extended attributess   Windows access control listss   Case sensitivitys   Escape DOS devicess   Escape trailing spacess   Mac OS X style resource forkss   Mac OS X Finder informations   
(   R   R   R   t	   ownershipt	   hardlinkst
   fsync_dirst   dir_inc_permst
   high_permst   symlink_permst   extended_filenamest   win_reserved_filenamest   aclst   east   win_aclst   case_sensitivet   escape_dos_devicest   escape_trailing_spacest   resource_forkst
   carbonfilet   join(   R   R   R   (    (   R   R   R
   s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   __str__=   s:    -
	
			c         C   s   | i  t i j p t  | |  _ d |  _ |  i | d  |  i |  |  i | d  |  i	 |  |  i
   |  i |  |  i |  |  i |  |  S(   s   Set variables using fs tested at RPath rp.  Run locally.

		This method does not write to the file system at all, and
		should be run on the file system when the file system will
		only need to be read.

		Only self.acls and self.eas are set.

		i   i    (   t   connt   Globalst   local_connectionR   t   root_rpR   t   set_east   set_aclst   set_win_aclst   set_resource_fork_readonlyt   set_carbonfilet   set_case_sensitive_readonlyt   set_escape_dos_devicest   set_escape_trailing_spaces(   R   t   rp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   init_readonlyr   s    
		
c         C   sh  | i  t i j p t  | i   p5 | i   p t | i | i   f  | i   n | |  _ d |  _	 t
 i |  } | i   |  i |  |  i |  |  i |  |  i |  |  i |  |  i |  |  i | d  |  i |  |  i | d  |  i |  |  i |  |  i   |  i |  |  i |  |  i |  |  i |  | i   |  S(   s   Set variables using fs tested at rp_base.  Run locally.

		This method creates a temp directory in rp_base and writes to
		it in order to test various features.  Use on a file system
		that will be written to.

		i    i   (   R(   R)   R*   R   t   isdirt   lstatt   patht   mkdirR+   R   t   TempFilet
   new_in_dirt   set_extended_filenamest   set_win_reserved_filenamest   set_case_sensitive_readwritet   set_ownershipt   set_hardlinkst   set_fsync_dirsR,   R-   R.   t   set_dir_inc_permst   set_resource_fork_readwriteR0   t   set_high_perms_readwritet   set_symlink_permsR2   R3   t   delete(   R   t   rbdirt   subdir(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   init_readwrite   s4    '		


c         C   s   | i  d  } | i   | i   \ } } y, | i | d | d  | i d d  Wn% t t t f j
 o d |  _ n Xd |  _ | i   d S(   sA   Set self.ownership to true iff testdir's ownership can be changedt   fooi   i    N(	   R   t   toucht	   getuidgidt   chownt   IOErrort   OSErrort   AttributeErrorR   RF   (   R   t   testdirt   tmp_rpt   uidt   gid(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR?      s    
 	c         C   s   | i  d  } | i  d  } | i   | i  d  } | i   yC | i | i  | i   | i   j o t t i d   n WnV t t	 t
 f j
 oA t i d j o! t i d |  i i f d  n d	 |  _ n Xd |  _ d	 S(
   s<   Set self.hardlinks to true iff hard linked files can be madet   hardlinked_file1t   hlt   hardlinked_file2s   Hard links don't comparei    s7   Warning: hard linking not supported by filesystem at %si   i   N(   R   R9   RK   t   hardlinkR8   t   getinodeRN   t   errnot
   EOPNOTSUPPRO   RP   R)   t   preserve_hardlinkst   logt   LogR+   R   R   (   R   RQ   t	   hl_sourcet   hl_dirt   hl_dest(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR@      s    

	c         C   st   | i  t i j p t  y | i   Wn< t t f j
 o* t i d | i	 f d  d |  _
 n Xd |  _
 d S(   s1   Set self.fsync_dirs if directories can be fsync'dsN   Directories on file system at %s are not fsyncable.
Assuming it's unnecessary.i   i    i   N(   R(   R)   R*   R   t   fsyncRN   RO   R]   R^   R8   R   (   R   RQ   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyRA      s     	c      	   C   s6  |  i  p t  d } | i |  } | i   | i   p t  | i   d t d  t d  t d  } d	 } y | i |  } | i   WnB t t	 f j
 o0 | o | i   p t  n d |  _
 nY X| i   p t  y | i   Wn) t t	 f j
 o t i i d  n Xd |  _
 d	 S(
   s5   Set self.extended_filenames by trying to write a paths   5-_ a.snapshot.gzt   unii   i   i   i    s   Could not delete extended filenames test file. If you are using a CIFS share, please see the FAQ entry about characters being transformed to a '?'i   N(   R   R   R   RK   R7   RF   t   chrR   RN   RO   R   R]   R^   t
   FatalError(   R   RH   t   ordinary_filenamet   ord_rpt   extended_filenamet   ext_rp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR<      s*    

$ c      	   C   s   |  i  p t  d } d } y | i |  } | i   WnB t t f j
 o0 | o | i   p t  n d |  _ nR X| i   p t  y | i	   Wn" t t f j
 o d |  _ n Xd |  _ d S(   s9   Set self.win_reserved_filenames by trying to write a paths   :\"i   i    N(
   R   R   R   R   RK   RN   RO   R7   R   RF   (   R   RH   t   win_reserved_filenamet   win_rp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR=      s      c      
   C   s	  t  i | i j p t  | i   p t  t  i d j o! t i d d  d |  _ d Sn y d d k	 } Wn: t
 j
 o. t i d | i f d  d |  _ d Sn Xy | i d | i  Wn6 t j
 o* t i d | i f d  d |  _ n Xd	 |  _ d S(
   s>   Set self.acls based on rp.  Does not write.  Needs to be locali    s@   POSIX ACLs test skipped. rdiff-backup run with --no-acls option.i   Nisc   Unable to import module posix1e from pylibacl package.
POSIX ACLs not supported on filesystem at %st   files,   POSIX ACLs not supported by filesystem at %si   (   R)   R*   R(   R   R7   t   acls_activeR]   R^   R   t   posix1et   ImportErrorR8   t   ACLRN   (   R   R4   Rn   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR-     s(    		 			 c         C   s   |  i  p t  | i d  } | i   | i d  } | i   o6 | i   | i   | i   p t  d |  _ n | i   d |  _ d S(   s9   Determine if directory at rp is case sensitive by writingt   At   ai    i   N(   R   R   R   RK   R7   RF   t   setdataR!   (   R   RH   t   upper_at   lower_a(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR>   '  s    



c            sj     f d     d   }   |  } | p, t  i d | i d d  d |  _ d Sn | |   |  _ d S(   s>   Determine if directory at rp is case sensitive without writingc            s   t  i |   } x2 | D]* } | | i   j o |  | | f Sq q WxI | D]A } |  i |  } | i   o   |  } | o | Sq qK qK Wd S(   s   Find a (subdir_rp, dirlist) with a letter in it, or None

			Recurse down the directory, looking for any file that has
			a letter in it.  Return the pair (rp, [list of filenames])
			where the list is of the directory containing rp.

			N(   t   robustt   listrpt   swapcaseR   R6   R   (   RH   t   lt   filenamet   dir_rpt	   subsearch(   t   find_letter(    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR}   8  s       c         S   s   y |  i  |  } Wn t j
 o d Sn X| i   p
 t |  | i   } | | j o d Sn |  i  |  } | i   o d Sn d S(   s0   Return 1 if filename shows system case sensitivei    i   (   R   RO   R7   R   Rx   (   R{   t   dirlistRz   t	   letter_rpt   swappedt
   swapped_rp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   test_tripleK  s    	  sG   Warning: could not determine case sensitivity of source directory at
  s\   
because we can't find any files with letters in them.
It will be treated as case sensitive.i   i   N(   R]   R^   R8   R!   (   R   R4   R   t   triple(    (   R}   s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR1   6  s    		c         C   s  t  i | i j p t  | i   p t  t  i d j o! t i d d  d |  _ d Sn y d d k	 } Wn: t
 j
 o. t i d | i f d  d |  _ d Sn Xy | i } Wn t j
 o d } n X| d j  p | d j o t i d	 | f d
  n yX | i | i  | o= | i | i d d  | i | i d  d j p t  n Wnk t j
 o* t i d | i f d  d |  _ n@ t j
 o* t i d | i f d  d |  _ n Xd |  _ d S(   s@   Set extended attributes from rp. Tests writing if write is true.i    sH   Extended attributes test skipped. rdiff-backup run with --no-eas option.i   NisT   Unable to import module xattr.
Extended attributes not supported on filesystem at %st   unknowns   0.2.2s   Warning: Your version of pyxattr (%s) has broken support for extended
attributes on symlinks. If you choose not to upgrade to a more recent version,
you may see many warning messages from listattr().
i   s	   user.tests   test vals5   Extended attributes not supported by filesystem at %ss   Extended attributes support is broken on filesystem at %s.
Please upgrade the filesystem driver, contact the developers,
or use the --no-eas option to disable extended attributes
support and suppress this message.i   (   R)   R*   R(   R   R7   t
   eas_activeR]   R^   R   t   xattrRo   R8   t   __version__RP   t	   listxattrt   setxattrt   getxattrRN   (   R   R4   t   writeR   t   ver(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR,   d  sF    		 				+		c         C   s  t  i | i j p t  | i   p t  t  i d j o! t i d d  d |  _ d Sn y d d k	 } d d k
 } Wn7 t j
 o+ t i d | i d  d |  _ d Sn Xy | i | i | i | i | i B| i B } | i   } | i   } | oL | i | i | i | i | i B| i B| i   | i   | i   d  n WnC t t | i f j
 o+ t i d | i d  d |  _ d Sn Xy t i   WnC t t | i f j
 o+ t i d | i d  d |  _ d Sn Xd	 |  _ d S(
   s2   Test if windows access control lists are supportedi    sB   Windows ACLs test skipped. rdiff-backup run with --no-acls option.i   NisU   Unable to import win32security module. Windows ACLs
not supported by filesystem at %ssL   Unable to load a Windows ACL.
Windows ACLs not supported by filesystem at %ssG   Unable to init win_acls.
Windows ACLs not supported by filesystem at %si   (   R)   R*   R(   R   R7   t   win_acls_activeR]   R^   R    t   win32securityt
   pywintypesRo   R8   t   GetNamedSecurityInfot   SE_FILE_OBJECTt   OWNER_SECURITY_INFORMATIONt   GROUP_SECURITY_INFORMATIONt   DACL_SECURITY_INFORMATIONt   GetSecurityDescriptorDaclt   GetAceCountt   SetNamedSecurityInfot   GetSecurityDescriptorOwnert   GetSecurityDescriptorGroupR   RO   RP   t   errort	   init_acls(   R   R{   R   R   R   t   sdt   aclt   n(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR.     sV    														c         C   s   | i  d  } | i   y | i d  Wn* t j
 o | i   d |  _ d Sn X| i   | i   p t  | i	   d j o d |  _ n
 d |  _ | i   d S(   s<   See if increments can have full permissions like a directoryt   dir_inc_checki  i    Ni   (
   R   RK   t   chmodRO   RF   R   Rs   t   isregR   t   getperms(   R   R4   t   test_rp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyRB     s    
 
		
 	c      
   C   s   y d d k  } d d k } Wn& t t f j
 o d |  _ d Sn Xy | i i d  } Wn d |  _ d Sn Xd |  _ d S(   sm   Test for support of the Mac Carbon library.  This library
		can be used to obtain Finder info (creator/type).iNi    t   .i   (   t   Carbon.Filet   MacOSRo   RP   R%   t   Filet   FSSpec(   R   t   CarbonR   t   x(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR0     s    		 	c         C   s
  | i  t i j p t  | i d  } | i   d } y t t i i	 | i d d  d  } | i
 |  | i   p t  t t i i	 | i d d  d  } | i   } | i   p t  Wn" t t f j
 o d |  _ n X| | j |  _ | i   d S(	   sC   Test for resource forks by writing to regular_file/..namedfork/rsrct   regfiles1   test string---this should end up in resource forks   ..namedforkt   rsrct   wbt   rbi    N(   R(   R)   R*   R   R   RK   t   opent   osR8   R&   R   t   closet   readRO   RN   R$   RF   (   R   R{   t   reg_rpR
   t   fp_writet   fp_readt   s_back(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyRC     s    
$$ c         C   s   x t  i |  i   D] } | i   o yP | i t i i d d   } | i d  } | i	   | i
   p t  Wn& t t f j
 o d |  _ d Sn Xd |  _ d Sq q Wd |  _ d S(   s   Test for resource fork support by testing an regular file

		Launches search for regular file in given directory.  If no
		regular file is found, resource_fork support will be turned
		off by default.

		s   ..namedforkR   R   i    Ni   (   t	   selectiont   Selectt   set_iterR   R   R   R8   R&   R   R   R   R   RO   RN   R$   (   R   R{   R4   t   rforkt   fp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR/     s     
			c         C   s   | i  d  } | i   | i  d  } | i   y8 | i d  | i d  | i d  | i d  Wn" t t f j
 o d |  _ n Xd |  _ | i   | i   d S(   s/   Test for writing high-bit permissions like suidt   high_perms_filet   high_perms_diri   i  i    i   N(   R   RK   R   RO   RN   R   RF   (   R   R{   t   tmpf_rpt   tmpd_rp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyRD     s    

 	
c         C   s   | i  d  } | i   | i  d  } y | i d  Wn" t t f j
 o d |  _ nS X| i   | i   p t  | i	   d j o d |  _ n
 d |  _ | i
   | i
   d S(   s1   Test if symlink permissions are affected by umaskt   symlinked_file1t   symlinked_file2i    i  i   N(   R   RK   t   symlinkRO   RP   R   Rs   t   issymR   R   RF   (   R   R{   t
   sym_sourcet   sym_dest(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyRE     s    

 	
c         C   s   yd | i  d  } | i   o$ t i d | i d  d |  _ n! t i d | i d  d |  _ Wn3 t j
 o' t i d | i d  d |  _ n Xd S(   s7   If special file con can be stat'd, escape special filest   cons/   escape_dos_devices required by filesystem at %si   i   s3   escape_dos_devices not required by filesystem at %si    N(   R   R7   R]   R^   R8   R"   RO   (   R   RH   t	   device_rp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR2   ,  s    			c         C   s   d |  _  d  Syx | i d  } | i   | i   o. t i d | i d  d |  _  | i   n! t i d | i d  d |  _  Wn9 t t	 f j
 o' t i d | i d  d |  _  n Xd  S(   Ni    s   test s7   escape_trailing_spaces not required by filesystem at %si   s3   escape_trailing_spaces required by filesystem at %si   (
   R#   R   RK   R7   R]   R^   R8   RF   RO   RN   (   R   RH   t   space_rp(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR3   =  s"    	
				N(,   t   __name__t
   __module__t   __doc__R   R   R   R!   R   R   R   R    R   R   R   R$   R%   R   R   R   R"   R#   R   R   R'   R5   RI   R?   R@   RA   R<   R=   R-   R>   R1   R,   R.   RB   R0   RC   R/   RD   RE   R2   R3   (    (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR    "   sR   	5		%			
	#				.	,	2							c         C   sa   t  i d j o> |  d j p |  d j o$ t i d d  t i d d  n t |   i |  S(   s   Return an fsa with given description_string

	Will be initialized read_only with given RPath rp.  We separate
	this out into a separate function so the request can be vetted by
	the security module.

	t   ntt   sources   rdiff-backup repositorys(   Hardlinks disabled by default on Windowsi   R\   i    (   R   R   R]   R^   R)   t   setR    R5   (   t   desc_stringR4   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   get_readonly_fsaU  s
    t
   SetGlobalsc           B   s   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d	   Z d
   Z d   Z d   Z d   Z RS(   s   Various functions for setting Globals vars given FSAbilities above

	Container for BackupSetGlobals and RestoreSetGlobals (don't use directly)

	c         C   s*   | | |  _  |  _ | | |  _ |  _ d S(   s'   Just store some variables for use belowN(   t   in_connt   out_connt   src_fsat   dest_fsa(   R   R   R   R   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR   i  s    c         C   s#   |  i  |  i i |  i i d  d  S(   NR   t	   eas_writet   eas_conn(   s
   eas_activeR   R   (   t   update_tripleR   R   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR,   n  s    c         C   sL   |  i  |  i i |  i i d  t i o t i o t i i	 d  n d  S(   NRm   t
   acls_writet	   acls_connsK   --never-drop-acls specified, but ACL support
missing from source filesystem(   s   acls_activeR   R   (
   R   R   R   R   R)   t   never_drop_aclsRm   R]   R^   Re   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR-   r  s    c         C   s#   |  i  |  i i |  i i d  d  S(   NR   t   win_acls_writet   win_acls_conn(   s   win_acls_activeR   R   (   R   R   R    R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR.   y  s    c         C   s#   |  i  |  i i |  i i d  d  S(   Nt   resource_forks_activet   resource_forks_writet   resource_forks_conn(   R   R   R   (   R   R   R$   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   set_resource_forks}  s    	 c         C   s#   |  i  |  i i |  i i d  d  S(   Nt   carbonfile_activet   carbonfile_writet   carbonfile_conn(   R   R   R   (   R   R   R%   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR0     s    c         C   s.   t  i d j o t i d |  i i  n d  S(   Ni    R\   (   R)   R\   t   SetConnectionst   UpdateGlobalR   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR@     s    	c         C   s   t  i d |  i i  d  S(   Nt   fsync_directories(   R   R   R   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   set_fsync_directories  s    	c         C   s   t  i d |  i i  d  S(   Nt   change_ownership(   R   R   R   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   set_change_ownership  s    	c         C   s%   |  i  i p t i d d  n d  S(   Nt   permission_maski  (   R   R   R   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   set_high_perms  s    c         C   s   t  i d |  i i  d  S(   NR   (   R   R   R   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyRE     s    	c         C   s   t  i d |  i i  d  S(   NR"   (   R   R   R   R"   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR2     s    	c         C   s   t  i d |  i i  d  S(   NR#   (   R   R   R   R#   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR3     s    	(   R   R   R   R   R,   R-   R.   R   R0   R@   R   R   R   RE   R2   R3   (    (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR   c  s   												t   BackupSetGlobalsc           B   sD   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   s<   Functions for setting fsa related globals for backup sessionc         C   s   | \ } } } t  i |  d j o d Sn x | D] } t i | d  q4 W| p d Sn t i | d  |  i i  i | d  | o* t i | d  |  i i  i | d  n d S(   s:   Many of the settings have a common form we can handle herei    Ni   (   R)   t   getR   R   R   R   t	   set_localR   (   R   t   src_supportt   dest_supportt   attr_triplet   active_attrt
   write_attrt	   conn_attrt   attr(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR     s        c         C   s   y0 | i  d  } | i   o
 d } n d } Wn t j
 o d } n Xt i d |  i i p |  t i d |  i i p | d  d S(   s*   If local edd or src edd, then must escape R   i   i    t   must_escape_dos_devicess$   Backup: must_escape_dos_devices = %di   N(	   R   R7   RO   R   R   R   R"   R]   R^   (   R   RG   R   t	   local_edd(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   set_must_escape_dos_devices  s     

 		c         C   s   t  i d d  d SyD | i d  } | i   | i   o d } | i   n d } Wn t t f j
 o d } n Xt  i d |  i i	 p |  t
 i d |  i i	 p | d  d S(   s*   If local ets or src ets, then must escape t   must_escape_trailing_spacesi    Ns   test i   s(   Backup: must_escape_trailing_spaces = %di   (   R   R   R   RK   R7   RF   RO   RN   R   R#   R]   R^   (   R   RG   R   t	   local_ets(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   set_must_escape_trailing_spaces  s    

		c         C   sM   |  i  | |  i   |  \ } } t i d |  t i o t i   n | S(   s   Set chars_to_quote setting for backup session

		Unlike the other options, the chars_to_quote setting also
		depends on the current settings in the rdiff-backup-data
		directory, not just the current fs features.

		t   chars_to_quote(   t   compare_ctq_filet   get_ctq_from_fsasR   R   R)   R   t   FilenameMappingt   set_init_quote_vals(   R   RG   t   forcet   ctqt   update(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   set_chars_to_quote  s    	
 c         C   s   g  } |  i  i o |  i i o | i d  n |  i i p | i d  | i d  n |  i i o/ |  i i o | i d  n | i d  n | o | i t i  n d i |  S(   s;   Determine chars_to_quote just from filesystems, no ctq files   A-Zt    -s   -s   "*/:<>?\\|t    (	   R   R!   R   R   R   R   R)   t   quoting_charR&   (   R   R  (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR     s     c         C   sG  | i  d  } | i   p> t i d j o
 | } n
 t i } | i |  | d f Sn t i d j o | i   } n
 t i } | | j o | d f Sn | d j o t i d d  | d f Sn t i d j oj | o? t i d | | f d  | i	   | i |  | d f SqCt i i
 d | | | i f  n d S(	   s9   Compare ctq file with suggested result, return actual ctqR   R  s]   Warning: File system no longer needs quoting, but we will retain for backwards compatibility.i   s[   Warning: migrating rdiff-backup repository fromold quoting chars %r to new quoting chars %ri   s  New quoting requirements!

The quoting chars this session needs %r do not match
the repository settings %r listed in

%s

This may be caused when you copy an rdiff-backup repository from a
normal file system onto a windows one that cannot support the same
characters, or if you backup a case-sensitive file system onto a
case-insensitive one that previously only had case-insensitive ones
backed up onto it.

By specificying the --force option, rdiff-backup will migrate the
repository from the old quoting chars to the new ones.N(   R   R7   R)   R   R   t   write_stringt   get_dataR]   R^   RF   Re   R8   (   R   RG   t   suggested_ctqR  t   ctq_rpt
   actual_ctq(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR     s4     
	 	 		
	(	   R   R   R   R   R   R   R  R   R   (    (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR     s   					t   RestoreSetGlobalsc           B   s2   e  Z d  Z d   Z d   Z d   Z d   Z RS(   s=   Functions for setting fsa-related globals for restore sessionc         C   s   | \ } } } t  i |  d j o d Sn x | D] } t i | d  q4 W| p d Sn t i | d  |  i i  i | d  |  i i  i | d  | o |  i i  i | d  n d S(   s   Update global settings for feature based on fsa results

		This is slightly different from BackupSetGlobals.update_triple
		because (using the mirror_metadata file) rpaths from the
		source may have more information than the file system
		supports.

		i    Ni   (   R)   R   R   R   R   R   R   R   (   R   R   R   R   R   R   R   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR   #  s    	     c         C   s   t  |  d d  d j	 o |  i i } n d } y0 | i d  } | i   o
 d } n d } Wn t j
 o d } n Xt i d | p |  t	 i
 d | p | d  d S(	   s*   If local edd or src edd, then must escape R   i    R   i   R   s%   Restore: must_escape_dos_devices = %di   N(   t   getattrR   R   R"   R   R7   RO   R   R   R]   R^   (   R   RG   t   src_eddR   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR   5  s     

 		c         C   s   t  i d d  d St |  d d  d j	 o |  i i } n d } yD | i d  } | i   | i   o d } | i	   n d } Wn t
 t f j
 o d } n Xt  i d | p |  t i d | p | d  d S(	   s*   If local ets or src ets, then must escape R   i    NR   s   test i   s)   Restore: must_escape_trailing_spaces = %di   (   R   R   R  R   R   R#   R   RK   R7   RF   RO   RN   R]   R^   (   R   RG   t   src_etsR   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR   D  s$    

		c         C   sr   t  i d j	 o d Sn | i d  } | i   o t i d | i    n! t i	 d d  t i d d  d S(   s-   Set chars_to_quote from rdiff-backup-data dirNR   sQ   Warning: chars_to_quote file not found,
assuming no quoting in backup repository.i   R  (
   R)   R   R   R   R7   R   R   R
  R]   R^   (   R   RG   R  (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR  ]  s     	(   R   R   R   R   R   R   R  (    (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR  !  s
   			t   SingleSetGlobalsc           B   sM   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 RS(   s9   For setting globals when dealing only with one filesystemc         C   s   | |  _  | |  _ d  S(   N(   R(   R   (   R   R(   t   fsa(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR   l  s    	c         C   s   | \ } } } t  i |  d j o d Sn x | D] } t i | d  q4 W| p d Sn t i | d  t i | d  |  i i  i | d  d S(   s'   Update global vars from single fsa testi    Ni   (   R)   R   R   R   R   R(   R   (   R   t   fsa_supportR   R   R   R   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR   p  s        c         C   s   |  i  |  i i d  d  S(   NR   R   R   (   s
   eas_actives	   eas_writes   eas_conn(   R   R   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR,   z  s    c         C   s   |  i  |  i i d  d  S(   NRm   R   R   (   s   acls_actives
   acls_writes	   acls_conn(   R   R   R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR-   }  s    c         C   s#   |  i  |  i i |  i i d  d  S(   NR   R   R   (   s   win_acls_actives   win_acls_writes   win_acls_conn(   R   R   R    R   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR.     s    c         C   s   |  i  |  i i d  d  S(   NR   R   R   (   s   resource_forks_actives   resource_forks_writes   resource_forks_conn(   R   R   R$   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR     s     c         C   s   |  i  |  i i d  d  S(   NR   R   R   (   s   carbonfile_actives   carbonfile_writes   carbonfile_conn(   R   R   R%   (   R   (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR0     s    (
   R   R   R   R   R   R,   R-   R.   R   R0   (    (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyR  j  s   		
				c         C   sj  t  i i t  i j p t  |  i i i d |   } t i t	 |  d  t
 d  i t  i  } t i t	 |  d  t |  i t  i i | |  } | i   | i   | i   | i   | i   | i   | i   | i   | i   | i   | i t  i |  } | i   | i   | i t  i  | i t  i  | o | o t i t  i  n d S(   s   Given rps for source filesystem and repository, set fsa globals

	This should be run on the destination connection, because we may
	need to write a new chars_to_quote file.

	R   i   t   destinationN(   R)   RG   R(   R*   R   t   fs_abilitiesR   R]   R^   t   strR    RI   R   R,   R-   R.   R   R0   R@   R   R   R   RE   R  R2   R3   R   R   R   t   update_quoting(   t   rpinR  R   R   t   bsgR  (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   backup_set_globals  s.    











c         C   s9  |  i  t i j p t  t i i  i i d t i  } t i t	 |  d  t
 d  i |   } t i t	 |  d  t t i i  |  i  | |  } | i   | i   | i   | i   | i   | i   | i   | i   | i   | i t i  | i   | i   | i t i  | i t i  d S(   s=   Set fsa related globals for restore session, given in/out rpss   rdiff-backup repositoryi   s   restore targetN(   R(   R)   R*   R   RG   R  R   R]   R^   R  R    RI   R  R,   R-   R.   R   R0   R@   R   R   RE   R  R2   R3   R   R   (   t   rpoutR   R   t   rsg(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   restore_set_globals  s*    










c         C   s	  | o |  i  i i |  i |   } n t |  i  i |   } t i t |  d  t	 |  i  |  } | i
   | i   | i   | i   | p, | i   | i   | i   | i   n | i t i  | i   | i   | i t i  | i t i  d S(   s:   Set fsa related globals for operation on single filesystemi   N(   R(   R  R   R8   R    RI   R]   R^   R  R  R,   R-   R   R0   R@   R   R   RE   R  R)   RG   R2   R3   R   R   (   R4   R   R  t   ssg(    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pyt   single_set_globals  s&    








(   R   RZ   R   R)   R]   R:   R   Rv   R   t   staticR   R    R    R   R   R   R  R  R  R  R   R   (    (    (    s>   /var/lib/python-support/python2.5/rdiff_backup/fs_abilities.pys   <module>   s   l  5	A}I#	"	