PATCH: preserve osx creation-date (was: Using pre2 for backing up a mac)

Wesley W. Terpstra wesley at terpstra.ca
Mon Oct 15 11:18:16 GMT 2007


On Oct 15, 2007, at 12:13 PM, Wesley W. Terpstra wrote:
> On Oct 15, 2007, at 1:55 AM, Wayne Davison wrote:
>> The name of the attribute was changed to com.apple.crtime96 (for  
>> the moment) .  Since it is not an official com.apple.* value, I  
>> didn't want to use a name that Apple might choose in the future.   
>> The name should probably go in the rsync.* namespace, but I'd need  
>> to move the code for reading and writing the value out of lib/ 
>> sysxattrs.c into xattrs.c to do that (I believe).
>
> Yeah, I suppose it should go in the rsync namespace too.

I notice that rsync is starting to converge towards a particular use  
of xattrs:
Copy meta-data that has an analogous concept on the remote host.
If -X is specified, copy anything that has no analogue into an  
extended attribute.

In looking over the bsd flags patch, I notice that it is relatively  
complicated and still doesn't move the data into an xattr on a system  
which has no support.

I wonder if the right command-line options might be something like this:
-X ... enables copying of user extended attributes
--flags ... enables copying of bsd flags
--osx (or similar) ... enables copying of osx related meta-data  
(ResourceFork/FinderInfo/CreationDate)
-A ... enables copying of ACL information

-M ... maps any unsupported meta-data into an extended attribute on  
the remote side (in the rsync namespace)
-Q ... silently drop unsupported meta-data

I'm not sure if --flags and --osx should be implied by -p, but I  
think so.

Then, use a pseudo-design pattern where every type of meta-data rsync  
can get/set has do_{get,set}_{acls,flags,owner,group,...}. A platform  
also provides a sys_supports_{acls,flags,...}(filename). This returns  
true/false if the meta-data is supported for that file (filesystems  
differ, as do platforms). Then, if the method could ever return true,  
the platform must provide matching sys_{set,get,could_set}_.... 
(filename) methods. could_set reports if there are sufficient  
permissions for the operation to succeed.

A design pattern like this could be used to easily extend rsync  
whenever new types of meta-data appear. For each piece of meta-data,  
the do_{get,set} methods look like this:

do_set_X(file, ...):
if (sys_supports_X(file)) {
  if (fake_super and NOT sys_could_set_X(file)) {
     return set_xattr(file, X, ...)
   } else {
     return sys_set_X(file, ...)
   }
} else {
   if (-M) {
     return set_xattr(file, X, ...)
   } else if (! -Q) {
     warning: meta-data X is unsupported on platform Y for file, use - 
Q to silence this warning, or -M to map it into an xattr.
     return
   }
}

do_get_X:
if (sys_supports_X(file)) {
   if (fake_super and NOT sys_could_set_X(file)) {
     return get_xattr(file, X)
   } else {
     return sys_get_X(file)
   }
} else {
   if (-M) {
     return get_xattr(file, X)
   }
   if (! -Q) {
     if (exist_xattr(file, X)) warning: discarding meta-data X that  
was stored in an xattr
   }
   return nothing_to_sync
}

Real implementations would be complicated by meta-data that is  
partially convertible. For example, file permissions and ACLs. But  
logically, from a user point of view, one wants the above behaviour.

What do you think?



More information about the rsync mailing list