3
# Copyright (C) 2013 to 2014 Tim Marston <tim@edm.am>
5
# This file is part of stdhome (hereafter referred to as "this program").
6
# See http://ed.am/dev/stdhome for more information.
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
23
from walker import Walker
24
import stdhome.the as the
27
class StatusWalker( Walker ):
28
"""The status walker compares all files in the repo with those in the home
29
directory and notes any that have been modified, are missing, or which have
30
changed type. It is run, for example, but the "stdhome status" comand.
33
Walker destination: home dir
34
Walker traversing: repo (unless a walk list is provided)
37
def __init__( self, walk_list = None ):
38
self.src_dir = the.repo.full_dir
39
self.dst_dir = the.full_home_dir
40
self.walk_list = walk_list if walk_list is not None else \
41
self.generate_walk_list( the.repo.full_dir )
43
self.modified = list()
48
def process( self, rel_file, src, dst ):
50
# entity is missing in home dir?
52
self.missing.append( rel_file )
54
# if a directory is missing in the home dir, we only really want to
55
# hear about that and not all the files it contains (which are also
59
# entity has changed type?
60
elif dst.get_type_name() != src.get_type_name():
61
self.changed.append( "%s (%s => %s)" % (
62
rel_file, src.get_type_name(), dst.get_type_name() ) )
64
# if an entity has changed to/from a directory, we don't care about
65
# anything that directory does/did contain
68
# entity has been modified?
69
# TODO: check directory permission changes
71
if not filecmp.cmp( src.file, dst.file ):
72
self.modified.append( rel_file )
74
if os.readlink( src.file ) != os.readlink( dst.file ):
75
self.modified.append( rel_file )