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

  • Committer: Tim Marston
  • Date: 2014-03-19 20:02:10 UTC
  • Revision ID: tim@ed.am-20140319200210-b6nm63rpktfmw0l3
changed working of output

Show diffs side-by-side

added added

removed removed

1
 
# conflict_walker.py
 
1
# conflict.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
23
from walker import Walker
23
24
import stdhome.the as the
24
25
 
27
28
        """The conflict walker traverses the repo looking for "deployment conflicts"
28
29
        (i.e., changes in the type of file).  This is run prior to running the
29
30
        copy-out walker and, as such, is given a list of files that were copied-in
30
 
        and which is can, therefore, safely ignore.
 
31
        and which is can, therefore, safely ignore.  It can also be given a list of
 
32
        files affected by the update (it will walk all repo files otherwise).
31
33
 
32
34
        Walker source:       repo
33
35
        Walker destination:  home dir
34
36
        Walker traversing:   repo
35
37
        """
36
38
 
37
 
        def __init__( self, ignore_files, updated_files = None ):
 
39
        def __init__( self, ignore_files, affected_files = None ):
38
40
                self.src_dir = the.repo.full_dir
39
 
                self.dst_dir = the.full_fsdir
40
 
                self.walk_list = updated_files if updated_files is not None else \
 
41
                self.dst_dir = the.full_home_dir
 
42
                self.walk_list = affected_files if affected_files is not None else \
41
43
                                                 self.generate_walk_list( the.repo.full_dir )
42
44
 
43
45
                self.ignore_files = ignore_files
44
46
                self.changed = list()
 
47
                self.obstructed = list()
45
48
 
46
49
 
47
50
        def process( self, rel_file, src_file, src_type, dst_file, dst_type ):
51
54
                if dst_type == '_': return False
52
55
 
53
56
                # if entity was copied-in, it's ok to copy out
54
 
                if rel_file in self.ignore_files:
 
57
                elif rel_file in self.ignore_files:
 
58
 
55
59
                        # we recurse only if this is a directory in the home dir, because if
56
60
                        # it isn't copying-out will replace whatever's in the home dir with
57
61
                        # the whole directory from the repo
66
70
                        # anything that directory does/did contain
67
71
                        return False
68
72
 
 
73
                # entity is a file (that wasn't copyied-in)?
 
74
                elif dst_type == 'f':
 
75
 
 
76
                        # only aproblem if its content is different
 
77
                        if not filecmp.cmp( src_file, dst_file ):
 
78
                                self.obstructed.append( rel_file )
 
79
                                return False
 
80
 
 
81
                # entity is a symlink (that wasn't copied-in)?
 
82
                if dst_type == 'l':
 
83
 
 
84
                        # only a problem if the symlink is different
 
85
                        if os.readlink( src_file ) != os.readlink( dst_file ):
 
86
                                self.obstructed.append( rel_file )
 
87
                                return False
 
88
 
69
89
                # nothing to see here
70
90
                return True