~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: John Arbash Meinel
  • Date: 2005-09-15 21:35:53 UTC
  • mfrom: (907.1.57)
  • mto: (1393.2.1)
  • mto: This revision was merged to the branch mainline in revision 1396.
  • Revision ID: john@arbash-meinel.com-20050915213552-a6c83a5ef1e20897
(broken) Transport work is merged in. Tests do not pass yet.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
# it's not predictable when it will be written out.
22
22
 
23
23
import os
24
 
import stat
25
24
import fnmatch
26
25
        
27
26
import bzrlib.tree
29
28
from bzrlib.errors import BzrCheckError
30
29
from bzrlib.trace import mutter
31
30
 
32
 
class TreeEntry(object):
33
 
    """An entry that implements the minium interface used by commands.
34
 
 
35
 
    This needs further inspection, it may be better to have 
36
 
    InventoryEntries without ids - though that seems wrong. For now,
37
 
    this is a parallel hierarchy to InventoryEntry, and needs to become
38
 
    one of several things: decorates to that hierarchy, children of, or
39
 
    parents of it.
40
 
    Another note is that these objects are currently only used when there is
41
 
    no InventoryEntry available - i.e. for unversioned objects.
42
 
    Perhaps they should be UnversionedEntry et al. ? - RBC 20051003
43
 
    """
44
 
 
45
 
    def __eq__(self, other):
46
 
        # yes, this us ugly, TODO: best practice __eq__ style.
47
 
        return (isinstance(other, TreeEntry)
48
 
                and other.__class__ == self.__class__)
49
 
 
50
 
    def kind_character(self):
51
 
        return "???"
52
 
 
53
 
 
54
 
class TreeDirectory(TreeEntry):
55
 
    """See TreeEntry. This is a directory in a working tree."""
56
 
 
57
 
    def __eq__(self, other):
58
 
        return (isinstance(other, TreeDirectory)
59
 
                and other.__class__ == self.__class__)
60
 
 
61
 
    def kind_character(self):
62
 
        return "/"
63
 
 
64
 
 
65
 
class TreeFile(TreeEntry):
66
 
    """See TreeEntry. This is a regular file in a working tree."""
67
 
 
68
 
    def __eq__(self, other):
69
 
        return (isinstance(other, TreeFile)
70
 
                and other.__class__ == self.__class__)
71
 
 
72
 
    def kind_character(self):
73
 
        return ''
74
 
 
75
 
 
76
 
class TreeLink(TreeEntry):
77
 
    """See TreeEntry. This is a symlink in a working tree."""
78
 
 
79
 
    def __eq__(self, other):
80
 
        return (isinstance(other, TreeLink)
81
 
                and other.__class__ == self.__class__)
82
 
 
83
 
    def kind_character(self):
84
 
        return ''
85
 
 
86
 
 
87
31
class WorkingTree(bzrlib.tree.Tree):
88
32
    """Working copy tree.
89
33
 
125
69
        """
126
70
        inv = self._inventory
127
71
        for path, ie in inv.iter_entries():
128
 
            if bzrlib.osutils.lexists(self.abspath(path)):
 
72
            if os.path.exists(self.abspath(path)):
129
73
                yield ie.file_id
130
74
 
131
75
 
139
83
        return os.path.join(self.basedir, filename)
140
84
 
141
85
    def has_filename(self, filename):
142
 
        return bzrlib.osutils.lexists(self.abspath(filename))
 
86
        return os.path.exists(self.abspath(filename))
143
87
 
144
88
    def get_file(self, file_id):
145
89
        return self.get_file_byname(self.id2path(file_id))
151
95
        ## XXX: badly named; this isn't in the store at all
152
96
        return self.abspath(self.id2path(file_id))
153
97
 
154
 
 
155
 
    def id2abspath(self, file_id):
156
 
        return self.abspath(self.id2path(file_id))
157
 
 
158
98
                
159
99
    def has_id(self, file_id):
160
100
        # files that have been deleted are excluded
162
102
        if not inv.has_id(file_id):
163
103
            return False
164
104
        path = inv.id2path(file_id)
165
 
        return bzrlib.osutils.lexists(self.abspath(path))
 
105
        return os.path.exists(self.abspath(path))
166
106
 
167
107
 
168
108
    __contains__ = has_id
169
109
    
170
110
 
171
111
    def get_file_size(self, file_id):
172
 
        return os.path.getsize(self.id2abspath(file_id))
 
112
        # is this still called?
 
113
        raise NotImplementedError()
 
114
 
173
115
 
174
116
    def get_file_sha1(self, file_id):
175
117
        path = self._inventory.id2path(file_id)
176
118
        return self._hashcache.get_sha1(path)
177
119
 
178
120
 
179
 
    def is_executable(self, file_id):
180
 
        if os.name == "nt":
181
 
            return self._inventory[file_id].executable
182
 
        else:
183
 
            path = self._inventory.id2path(file_id)
184
 
            mode = os.lstat(self.abspath(path)).st_mode
185
 
            return bool(stat.S_ISREG(mode) and stat.S_IEXEC&mode)
186
 
 
187
 
    def get_symlink_target(self, file_id):
188
 
        return os.readlink(self.id2abspath(file_id))
189
 
 
190
121
    def file_class(self, filename):
191
122
        if self.path2id(filename):
192
123
            return 'V'
240
171
                                            "now of kind %r"
241
172
                                            % (fap, f_ie.kind, f_ie.file_id, fk))
242
173
 
243
 
                # make a last minute entry
244
 
                if f_ie:
245
 
                    entry = f_ie
246
 
                else:
247
 
                    if fk == 'directory':
248
 
                        entry = TreeDirectory()
249
 
                    elif fk == 'file':
250
 
                        entry = TreeFile()
251
 
                    elif fk == 'symlink':
252
 
                        entry = TreeLink()
253
 
                    else:
254
 
                        entry = TreeEntry()
255
 
                
256
 
                yield fp, c, fk, (f_ie and f_ie.file_id), entry
 
174
                yield fp, c, fk, (f_ie and f_ie.file_id)
257
175
 
258
176
                if fk != 'directory':
259
177
                    continue
275
193
            if not self.is_ignored(subp):
276
194
                yield subp
277
195
 
278
 
    def iter_conflicts(self):
279
 
        conflicted = set()
280
 
        for path in (s[0] for s in self.list_files()):
281
 
            stem = get_conflicted_stem(path)
282
 
            if stem is None:
283
 
                continue
284
 
            if stem not in conflicted:
285
 
                conflicted.add(stem)
286
 
                yield stem
287
196
 
288
197
    def extras(self):
289
198
        """Yield all unknown files in this WorkingTree.
375
284
                    return pat
376
285
        else:
377
286
            return None
378
 
 
379
 
CONFLICT_SUFFIXES = ('.THIS', '.BASE', '.OTHER')
380
 
def get_conflicted_stem(path):
381
 
    for suffix in CONFLICT_SUFFIXES:
382
 
        if path.endswith(suffix):
383
 
            return path[:-len(suffix)]
 
287