/stdhome

To get this branch, use:
bzr branch http://bzr.ed.am/stdhome

« back to all changes in this revision

Viewing changes to lib/stdhome/walker/status.py

  • Committer: Tim Marston
  • Date: 2014-04-05 22:27:09 UTC
  • Revision ID: tim@ed.am-20140405222709-4mp50aiu184blnf1
fixed file_matcher

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# status.py
 
2
#
 
3
# Copyright (C) 2013 to 2014 Tim Marston <tim@edm.am>
 
4
#
 
5
# This file is part of stdhome (hereafter referred to as "this program").
 
6
# See http://ed.am/dev/stdhome for more information.
 
7
#
 
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.
 
12
#
 
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.
 
17
#
 
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/>.
 
20
 
 
21
 
 
22
import filecmp, os
 
23
from walker import Walker
 
24
import stdhome.the as the
 
25
 
 
26
 
 
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.
 
31
 
 
32
        Walker source:       repo
 
33
        Walker destination:  home dir
 
34
        Walker traversing:   repo (unless a walk list is provided)
 
35
        """
 
36
 
 
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 )
 
42
 
 
43
                self.modified = list()
 
44
                self.missing = list()
 
45
                self.changed = list()
 
46
 
 
47
 
 
48
        def process( self, rel_file, src, dst ):
 
49
 
 
50
                # entity is missing in home dir?
 
51
                if dst.type == '_':
 
52
                        self.missing.append( rel_file )
 
53
 
 
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
 
56
                        # obviously missing)
 
57
                        return False
 
58
 
 
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() ) )
 
63
 
 
64
                        # if an entity has changed to/from a directory, we don't care about
 
65
                        # anything that directory does/did contain
 
66
                        return False
 
67
 
 
68
                # entity has been modified?
 
69
                # TODO: check directory permission changes
 
70
                if src.type == 'f':
 
71
                        if not filecmp.cmp( src.file, dst.file ):
 
72
                                self.modified.append( rel_file )
 
73
                elif dst.type == 'l':
 
74
                        if os.readlink( src.file ) != os.readlink( dst.file ):
 
75
                                self.modified.append( rel_file )
 
76
 
 
77
                # nothing to see here
 
78
                return True