/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_walker.py

  • Committer: Tim Marston
  • Date: 2014-02-26 19:10:31 UTC
  • Revision ID: tim@ed.am-20140226191031-elcqy5j09h2syn2j
moved copy-in, copy-out and deployment conflict checking to a set of "walkers";
bzr vcs back-end now parses affected files during update; deployment state now
includes affected files

Show diffs side-by-side

added added

removed removed

1
 
# status.py
 
1
# status_walker.py
2
2
#
3
3
# Copyright (C) 2013 to 2014 Tim Marston <tim@edm.am>
4
4
#
19
19
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
20
 
21
21
 
22
 
import filecmp, os
 
22
import filecmp
23
23
from walker import Walker
24
24
import stdhome.the as the
25
25
 
29
29
        directory and notes any that have been modified, are missing, or which have
30
30
        changed type.  It is run, for example, but the "stdhome status" comand.
31
31
 
32
 
        Walker source:       repo
33
 
        Walker destination:  home dir
34
 
        Walker traversing:   repo (unless a walk list is provided)
 
32
        Walker source:       home dir
 
33
        Walker destination:  repo
 
34
        Walker traversing:   repo
35
35
        """
36
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 )
 
37
        def __init__( self ):
 
38
                self.src_dir = the.full_fsdir
 
39
                self.dst_dir = the.repo.full_dir
 
40
                self.walk_list = self.generate_walk_list( the.repo.full_dir )
42
41
 
43
42
                self.modified = list()
44
43
                self.missing = list()
45
44
                self.changed = list()
46
45
 
47
46
 
48
 
        def process( self, rel_file, src, dst ):
 
47
        def process( self, rel_file, src_file, src_type, dst_file, dst_type ):
49
48
 
50
49
                # entity is missing in home dir?
51
 
                if dst.type == '_':
 
50
                if src_type == '_':
52
51
                        self.missing.append( rel_file )
53
52
 
54
53
                        # if a directory is missing in the home dir, we only really want to
57
56
                        return False
58
57
 
59
58
                # 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() ) )
 
59
                elif src_type != dst_type:
 
60
                        self.changed.append( "%s (now %s)" % (
 
61
                                rel_file, self.name_of_type( src_type ) ) )
63
62
 
64
63
                        # if an entity has changed to/from a directory, we don't care about
65
64
                        # anything that directory does/did contain
67
66
 
68
67
                # entity has been modified?
69
68
                # TODO: check directory permission changes
70
 
                if src.type == 'f':
71
 
                        if not filecmp.cmp( src.file, dst.file ):
 
69
                if dst_type == 'f':
 
70
                        if not filecmp.cmp( src_file, dst_file ):
72
71
                                self.modified.append( rel_file )
73
 
                elif dst.type == 'l':
74
 
                        if os.readlink( src.file ) != os.readlink( dst.file ):
 
72
                elif dst_type == 'l':
 
73
                        if os.readlink( src_file ) != os.readlink( dst_file ):
75
74
                                self.modified.append( rel_file )
76
75
 
77
76
                # nothing to see here