/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: 2016-12-13 21:40:34 UTC
  • Revision ID: tim@ed.am-20161213214034-nd5t7ztnlrjd627i
fix add command and generic filename expansion/resolution to expend to
homedir-relative filename and absolute filename based on original filename, as
specified, rather than a fully, symlink-resolved filename.  So, e.g., if ~/bob
was a symlink to ~/fred, then ~/bob/a would resolve to the relative filename
bob/a, becuase it is inside the homedir (it would resolve to fred/a otherwise)

Show diffs side-by-side

added added

removed removed

Lines of Context:
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:       home dir
33
 
        Walker destination:  repo
 
32
        Walker source:       repo
 
33
        Walker destination:  home dir
34
34
        Walker traversing:   repo (unless a walk list is provided)
35
35
        """
36
36
 
37
37
        def __init__( self, walk_list = None ):
38
 
                self.src_dir = the.full_home_dir
39
 
                self.dst_dir = the.repo.full_dir
 
38
                self.src_dir = the.repo.full_dir
 
39
                self.dst_dir = the.full_home_dir
40
40
                self.walk_list = walk_list if walk_list is not None else \
41
41
                                                 self.generate_walk_list( the.repo.full_dir )
42
42
 
45
45
                self.changed = list()
46
46
 
47
47
 
48
 
        def process( self, rel_file, src_file, src_type, dst_file, dst_type ):
 
48
        def process( self, rel_file, src, dst ):
49
49
 
50
50
                # entity is missing in home dir?
51
 
                if src_type == '_':
52
 
                        self.missing.append( rel_file )
 
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 )
53
55
 
54
56
                        # if a directory is missing in the home dir, we only really want to
55
57
                        # hear about that and not all the files it contains (which are also
57
59
                        return False
58
60
 
59
61
                # entity has changed type?
60
 
                elif src_type != dst_type:
61
 
                        self.changed.append( "%s (now %s)" % (
62
 
                                rel_file, self.name_of_type( src_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() ) )
63
76
 
64
77
                        # if an entity has changed to/from a directory, we don't care about
65
78
                        # anything that directory does/did contain
66
79
                        return False
67
80
 
68
 
                # entity has been modified?
 
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
 
69
101
                # TODO: check directory permission changes
70
 
                if dst_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
102
 
77
103
                # nothing to see here
 
104
                if the.verbose >= 2:
 
105
                        print "  %s=%s %s" % ( dst.type, src.type, rel_file )
78
106
                return True