40
40
def __init__( self, updated_files = None ):
41
41
self.src_dir = the.repo.full_dir
42
self.dst_dir = the.full_fsdir
42
self.dst_dir = the.full_home_dir
43
43
self.walk_list = updated_files if updated_files is not None else \
44
44
self.generate_walk_list( the.repo.full_dir )
47
def process( self, rel_file, src_file, src_type, dst_file, dst_type ):
52
# if entity doesn't exist in home dir, create directory (no need to
53
# recurse, since we're copying the whole directory)
55
if the.verbose: print " _<d " + rel_file
57
shutil.copystat( src_file, dst_file )
60
# if entity is a file or symlink in home dir, replace it with
61
# directory (no need to recurse, since we're copying the whole
63
elif dst_type == 'f' or dst_type == 'l':
64
if the.verbose: print " %s<d %s" % ( dst_type, rel_file )
67
shutil.copystat( src_file, dst_file )
70
# if entity is a directory in home dir, copy permissions, as
71
# required (and recurse)
73
# TODO: should check permission and only do as necessary
74
if the.verbose: print " d<d " + rel_file
75
shutil.copystat( src_file, dst_file )
79
raise NotImplementedError()
84
# if entity doesn't exist in home dir, copy file
86
if the.verbose: print " _<f " + rel_file
87
shutil.copy( src_file, dst_file )
88
shutil.copystat( src_file, dst_file )
90
# if entity is a symlink in home dir, replace it with file
92
if the.verbose: print " l<f " + rel_file
94
shutil.copy( src_file, dst_file )
95
shutil.copystat( src_file, dst_file )
97
# if entity is a file in home dir, replace it only if it differs
99
if not filecmp.cmp( src_file, dst_file ):
100
if the.verbose: print " f<f " + rel_file
101
os.unlink( dst_file )
102
shutil.copy( src_file, dst_file )
103
shutil.copystat( src_file, dst_file )
105
if the.verbose: print " f=f " + rel_file
107
# if entity is a directory in home dir, replace it with file
108
elif dst_type == 'd':
109
if the.verbose: print " d<f " + rel_file
110
shutil.rmtree( dst_file )
111
shutil.copy( src_file, dst_file )
112
shutil.copystat( src_file, dst_file )
115
raise NotImplementedError()
120
# if entity doesn't exist in home dir, copy symlink
122
if the.verbose: print " _<l " + rel_file
123
os.symlink( os.readlink( src_file ), dst_file )
125
# if entity is a symlink in home dir, replace it only if it differs
126
elif dst_type == 'l':
127
if os.readlink( src_file ) != os.readlink( dst_file ):
128
if the.verbose: print " l<l " + rel_file
129
os.unlink( dst_file )
130
os.symlink( os.readlink( src_file ), dst_file )
132
if the.verbose: print " l=l " + rel_file
134
# if entity is a file in home dir, replace it with file
135
elif dst_type == 'f':
136
if the.verbose: print " f<l " + rel_file
137
os.unlink( dst_file )
138
os.symlink( os.readlink( src_file ), dst_file )
140
# if entity is a directory in home dir, replace it with file
141
elif dst_type == 'd':
142
if the.verbose: print " d<l " + rel_file
143
shutil.rmtree( dst_file )
144
os.symlink( os.readlink( src_file ), dst_file )
147
raise NotImplementedError()
149
# TODO: handle files missing in repo -- we may or may not want to remove
150
# them from home dir, depending on whether we wanted to delete them
151
# remotely or whether we just wanted to remove them from version control
153
# non-directories can not be recursed in to
47
def print_op( self, rel_file, operation ):
48
operation = re.sub( r'(.)(.)(.)', r'\3\2\1', operation )
49
operation = re.sub( r'\>', r'<', operation )
50
print " %s %s" % ( operation, rel_file )