/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: 2013-12-08 19:28:11 UTC
  • Revision ID: tim@ed.am-20131208192811-r20qj7cgmn4duw11
initial commit; basic app startup and initial command-line processing

Show diffs side-by-side

added added

removed removed

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
 
                        if the.verbose >= 2: print "  _|%s %s" % ( dst.type, rel_file )
53
 
                        if not the.config.ignores.matches( rel_file ):
54
 
                                self.missing.append( rel_file )
55
 
 
56
 
                        # if a directory is missing in the home dir, we only really want to
57
 
                        # hear about that and not all the files it contains (which are also
58
 
                        # obviously missing)
59
 
                        return False
60
 
 
61
 
                # entity has changed type?
62
 
                elif dst.get_type_name() != src.get_type_name():
63
 
 
64
 
                        # is it a directory that has changed to a symlnik to a directory and
65
 
                        # is an acceptable substitution?
66
 
                        if src.type == 'd' and dst.link_type == 'd' and \
67
 
                                        the.config.symlinks.matches( rel_file ):
68
 
                                if the.verbose >= 2: print "  d@d " + rel_file
69
 
                                return True
70
 
 
71
 
                        if the.verbose >= 2:
72
 
                                print "  %s|%s %s" % ( dst.type, src.type, rel_file )
73
 
                        if not the.config.ignores.matches( rel_file ):
74
 
                                self.changed.append( "%s (%s => %s)" % (
75
 
                                        rel_file, src.get_type_name(), dst.get_type_name() ) )
76
 
 
77
 
                        # if an entity has changed to/from a directory, we don't care about
78
 
                        # anything that directory does/did contain
79
 
                        return False
80
 
 
81
 
                # entity is a file that has been modified?
82
 
                if src.type == 'f':
83
 
                        if not filecmp.cmp( src.file, dst.file ):
84
 
                                if the.verbose >= 2: print "  f|f " + rel_file
85
 
                                if not the.config.ignores.matches( rel_file ):
86
 
                                        self.modified.append( rel_file )
87
 
                        else:
88
 
                                if the.verbose >= 2: print "  f=f " + rel_file
89
 
                        return False
90
 
 
91
 
                # entity is a symlink that has been modified?
92
 
                elif dst.type == 'l':
93
 
                        if os.readlink( src.file ) != os.readlink( dst.file ):
94
 
                                if the.verbose >= 2: print "  l|l " + rel_file
95
 
                                if not the.config.ignores.matches( rel_file ):
96
 
                                        self.modified.append( rel_file )
97
 
                        else:
98
 
                                if the.verbose >= 2: print "  l=l " + rel_file
99
 
                        return False
100
 
 
101
 
                # TODO: check directory permission changes
102
 
 
103
 
                # nothing to see here
104
 
                if the.verbose >= 2:
105
 
                        print "  %s=%s %s" % ( dst.type, src.type, rel_file )
106
 
                return True