/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/walker.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

20
20
 
21
21
 
22
22
import os
 
23
import stdhome.the as the
23
24
 
24
25
 
25
26
class Walker:
31
32
        process() for more information.
32
33
        """
33
34
 
 
35
 
34
36
        def walk( self ):
35
37
                """Iterates over self.walk_list, calling process() for each entry in turn.  For
36
38
                directory entries, where process() returns False, subsequent entries in
37
39
                walk_list that fall under the directory are skipped.
38
40
                """
39
41
 
 
42
                if the.verbose >= 3:
 
43
                        print "walking [%s]" % self.__class__.__name__
 
44
 
40
45
                skip = ''
41
 
 
42
46
                for rel_file in self.walk_list:
43
47
 
44
48
                        # if we're skipping, skip entries in subdirectories, or turn off
60
64
                        # way of knowing what to check.  It could be src_type or dst_type
61
65
                        # (if src_dir or dst_dir was used to generate the walk list) or it
62
66
                        # could be neither (if the walk list came from somewhere else).  But
63
 
                        # it shouldn't matter.  We adding an os.pathset to the end of the
64
 
                        # filename, so it wuill only match files that are descendents of a
65
 
                        # directory with the name of this file.
 
67
                        # it shouldn't matter: we add a path seperateor (os.sep) to the end
 
68
                        # of the filename, so it wuill only match files that are descendents
 
69
                        # of a directory with the name of this file.
66
70
                        if not recurse: skip = rel_file + os.sep
67
71
 
68
72
 
98
102
 
99
103
 
100
104
        @staticmethod
101
 
        def generate_walk_list( full_dir, rel_file = '' ):
 
105
        def generate_walk_list( full_dir, rel_file = '', recurse = True ):
102
106
                """Returns a list of files and directories in full_dir, specified as relative
103
107
                files (relative to full_dir), breadth first.
 
108
 
104
109
                """
105
110
 
106
111
                # ignore some files
107
 
                if rel_file in { '.bzr', '.bzrignore', '.stdhome', '.stdhomerc' }:
 
112
                static_ignores = [ '.stdhome', '.stdhomerc' ] + \
 
113
                                                 the.repo.vcs.ignored_files
 
114
                if rel_file in static_ignores:
108
115
                        return list()
109
116
 
110
117
                full_file = os.path.join( full_dir, rel_file )
116
123
                # directories are returned and recursed in to
117
124
                elif os.path.isdir( full_file ):
118
125
                        ret = [ rel_file ] if rel_file != '' else []
119
 
                        for file in os.listdir( full_file ):
120
 
                                ret.extend( Walker.generate_walk_list(
121
 
                                        full_dir, os.path.join( rel_file, file ) ) )
 
126
                        if recurse:
 
127
                                for file in os.listdir( full_file ):
 
128
                                        ret.extend( Walker.generate_walk_list(
 
129
                                                full_dir, os.path.join( rel_file, file ) ) )
122
130
                        return sorted( ret )
123
131
 
124
132
                # other kinds are invalid