22
22
import filecmp, os, shutil
23
23
from walker import Walker
24
from stdhome import the
25
from stdhome import util
24
import stdhome.the as the
28
27
class CopyBaseWalker( Walker ):
29
28
"""The copy-base walker traverses a walklist ruthlessly mirroring src to dst.
30
29
It is designed to be the base class of both the copy-in and copy-out walker,
31
30
both of which are specialisations of this purpose. See them for more
32
information. The report method, which can be overridden in derived classes,
33
takes, in addition to the relative filename, a source file type, an
34
operation, and a sestination file type. Valid file types are f (file), l
35
(symlink), d (directory) and _ (non-existant). Valid operations are *
36
(modify), = (skip: same), @ (skip: symlink substitute) and # (skip:
31
information. The print_op method, derived in those classes, takes, in
32
addition to the relative filename, a source file type, an operation, and a
33
sestination file type. Valid file types are f (file), l (symlink), d
34
(directory) and _ (non-existant). Valid operations are * (modify), = (skip:
35
same), @ (skip: symlink substitute) and # (skip: ignored).
43
40
self.check_src_symlinks = False
44
41
self.check_dst_symlinks = False
45
42
self.check_dst_ignores = False
49
def print_op( self, rel_file, src, op, dst ):
52
if self.report and the.verbose < 2 and op == '*':
54
print " N %s" % ( rel_file )
56
print " D %s" % ( rel_file )
58
print " M %s" % ( rel_file )
60
print " K %s" % ( rel_file )
63
45
def process( self, rel_file, src, dst ):
70
52
# src entity is directory
71
53
if src.type == 'd':
73
# if dst entity doesn't exist, create it (and recurse)
55
# if dst entity doesn't exist, create directory (no need to recurse,
56
# since we're copying the whole directory)
74
57
if dst.type == '_':
75
58
self.print_op( rel_file, 'd', '*', '_' )
77
shutil.copystat( src.file, dst.file )
59
shutil.copytree( src.file, dst.file, True )
80
61
# if dst entity is a directory, copy permissions, as required (and
82
63
elif dst.type == 'd':
83
if os.stat( src.file ).st_mode != os.stat( dst.file ).st_mode:
84
self.print_op( rel_file, 'd', '*', 'd' )
85
shutil.copystat( src.file, dst.file )
87
self.print_op( rel_file, 'd', '=', 'd' )
64
# TODO: should check permission and only do as necessary
65
self.print_op( rel_file, 'd', '*', 'd' )
66
shutil.copystat( src.file, dst.file )
90
69
# if dst entity is a symlink to a directory, and this is an