/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
1
# Copyright (C) 2005-2010 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
17
"""Weave-era working tree objects."""
18
6379.6.3 by Jelmer Vernooij
Use absolute_import.
19
from __future__ import absolute_import
20
6876.4.1 by Jelmer Vernooij
Add format setting with ignore filename.
21
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
22
from ... import (
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
23
    conflicts as _mod_conflicts,
24
    errors,
6754.8.9 by Jelmer Vernooij
Fix more tests.
25
    lock,
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
26
    osutils,
27
    revision as _mod_revision,
28
    transform,
6670.4.1 by Jelmer Vernooij
Update imports.
29
    )
30
from ...bzr import (
31
    inventory,
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
32
    xml5,
33
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
34
from ...mutabletree import MutableTree
35
from ...sixish import (
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
36
    BytesIO,
37
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
38
from ...transport.local import LocalTransport
39
from ...workingtree import (
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
40
    WorkingTreeFormat,
41
    )
6670.4.1 by Jelmer Vernooij
Update imports.
42
from ...bzr.workingtree_3 import (
6110.4.4 by Jelmer Vernooij
Add common base class.
43
    PreDirStateWorkingTree,
44
    )
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
45
46
47
def get_conflicted_stem(path):
48
    for suffix in _mod_conflicts.CONFLICT_SUFFIXES:
49
        if path.endswith(suffix):
50
            return path[:-len(suffix)]
51
52
53
class WorkingTreeFormat2(WorkingTreeFormat):
54
    """The second working tree format.
55
56
    This format modified the hash cache from the format 1 hash cache.
57
    """
58
59
    upgrade_recommended = True
60
61
    requires_normalized_unicode_filenames = True
62
63
    case_sensitive_filename = "Branch-FoRMaT"
64
65
    missing_parent_conflicts = False
66
5993.3.1 by Jelmer Vernooij
Add WorkingTreeFormat.supports_versioned_directories attribute.
67
    supports_versioned_directories = True
68
6876.4.1 by Jelmer Vernooij
Add format setting with ignore filename.
69
    ignore_filename = '.bzrignore'
70
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
71
    def get_format_description(self):
72
        """See WorkingTreeFormat.get_format_description()."""
73
        return "Working tree format 2"
74
75
    def _stub_initialize_on_transport(self, transport, file_mode):
76
        """Workaround: create control files for a remote working tree.
77
78
        This ensures that it can later be updated and dealt with locally,
79
        since BzrDirFormat6 and BzrDirFormat5 cannot represent dirs with
80
        no working tree.  (See bug #43064).
81
        """
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
82
        sio = BytesIO()
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
83
        inv = inventory.Inventory()
84
        xml5.serializer_v5.write_inventory(inv, sio, working=True)
85
        sio.seek(0)
86
        transport.put_file('inventory', sio, file_mode)
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
87
        transport.put_bytes('pending-merges', b'', file_mode)
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
88
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
89
    def initialize(self, a_controldir, revision_id=None, from_branch=None,
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
90
                   accelerator_tree=None, hardlink=False):
91
        """See WorkingTreeFormat.initialize()."""
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
92
        if not isinstance(a_controldir.transport, LocalTransport):
93
            raise errors.NotLocalUrl(a_controldir.transport.base)
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
94
        if from_branch is not None:
95
            branch = from_branch
96
        else:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
97
            branch = a_controldir.open_branch()
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
98
        if revision_id is None:
99
            revision_id = _mod_revision.ensure_null(branch.last_revision())
100
        branch.lock_write()
101
        try:
102
            branch.generate_revision_history(revision_id)
103
        finally:
104
            branch.unlock()
105
        inv = inventory.Inventory()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
106
        wt = WorkingTree2(a_controldir.root_transport.local_abspath('.'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
107
                          branch,
108
                          inv,
109
                          _internal=True,
110
                          _format=self,
111
                          _controldir=a_controldir,
112
                          _control_files=branch.control_files)
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
113
        basis_tree = branch.repository.revision_tree(revision_id)
6405.2.6 by Jelmer Vernooij
Lots of test fixes.
114
        if basis_tree.get_root_id() is not None:
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
115
            wt.set_root_id(basis_tree.get_root_id())
116
        # set the parent list and cache the basis tree.
117
        if _mod_revision.is_null(revision_id):
118
            parent_trees = []
119
        else:
120
            parent_trees = [(revision_id, basis_tree)]
121
        wt.set_parent_trees(parent_trees)
122
        transform.build_tree(basis_tree, wt)
6435.1.1 by Jelmer Vernooij
Add post_build_tree hook.
123
        for hook in MutableTree.hooks['post_build_tree']:
124
            hook(wt)
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
125
        return wt
126
127
    def __init__(self):
128
        super(WorkingTreeFormat2, self).__init__()
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
129
        from breezy.plugins.weave_fmt.bzrdir import BzrDirFormat6
6746.2.1 by Jelmer Vernooij
Rename matchingbzrdir to matchingcontroldir.
130
        self._matchingcontroldir = BzrDirFormat6()
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
131
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
132
    def open(self, a_controldir, _found=False):
133
        """Return the WorkingTree object for a_controldir
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
134
135
        _found is a private parameter, do not use it. It is used to indicate
136
               if format probing has already been done.
137
        """
138
        if not _found:
139
            # we are being called directly and must probe.
140
            raise NotImplementedError
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
141
        if not isinstance(a_controldir.transport, LocalTransport):
142
            raise errors.NotLocalUrl(a_controldir.transport.base)
143
        wt = WorkingTree2(a_controldir.root_transport.local_abspath('.'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
144
                          _internal=True,
145
                          _format=self,
146
                          _controldir=a_controldir,
147
                          _control_files=a_controldir.open_branch().control_files)
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
148
        return wt
149
150
6110.4.4 by Jelmer Vernooij
Add common base class.
151
class WorkingTree2(PreDirStateWorkingTree):
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
152
    """This is the Format 2 working tree.
153
154
    This was the first weave based working tree.
155
     - uses os locks for locking.
156
     - uses the branch last-revision.
157
    """
158
6110.4.2 by Jelmer Vernooij
Move hashcache use to bzrlib.workingtree_3 and bzrlib.plugins.weave_fmt.workingtree.
159
    def __init__(self, basedir, *args, **kwargs):
160
        super(WorkingTree2, self).__init__(basedir, *args, **kwargs)
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
161
        # WorkingTree2 has more of a constraint that self._inventory must
162
        # exist. Because this is an older format, we don't mind the overhead
163
        # caused by the extra computation here.
164
165
        # Newer WorkingTree's should only have self._inventory set when they
166
        # have a read lock.
167
        if self._inventory is None:
168
            self.read_working_inventory()
169
170
    def _get_check_refs(self):
171
        """Return the references needed to perform a check of this tree."""
172
        return [('trees', self.last_revision())]
173
174
    def lock_tree_write(self):
175
        """See WorkingTree.lock_tree_write().
176
177
        In Format2 WorkingTrees we have a single lock for the branch and tree
178
        so lock_tree_write() degrades to lock_write().
179
180
        :return: An object with an unlock method which will release the lock
181
            obtained.
182
        """
183
        self.branch.lock_write()
184
        try:
6754.8.9 by Jelmer Vernooij
Fix more tests.
185
            token = self._control_files.lock_write()
186
            return lock.LogicalLockResult(self.unlock, token)
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
187
        except:
188
            self.branch.unlock()
189
            raise
190
191
    def unlock(self):
192
        # we share control files:
193
        if self._control_files._lock_count == 3:
5900.1.2 by Jelmer Vernooij
Fix weave plugin.
194
            # do non-implementation specific cleanup
195
            self._cleanup()
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
196
            # _inventory_is_modified is always False during a read lock.
197
            if self._inventory_is_modified:
198
                self.flush()
199
            self._write_hashcache_if_dirty()
200
201
        # reverse order of locking.
202
        try:
203
            return self._control_files.unlock()
204
        finally:
205
            self.branch.unlock()
206
207
    def _iter_conflicts(self):
208
        conflicted = set()
7143.19.5 by Jelmer Vernooij
Undo removal of kind.
209
        for path, file_class, file_kind, entry in self.list_files():
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
210
            stem = get_conflicted_stem(path)
211
            if stem is None:
212
                continue
213
            if stem not in conflicted:
214
                conflicted.add(stem)
215
                yield stem
216
217
    def conflicts(self):
6754.8.16 by Jelmer Vernooij
Get rid of all uses of needs_read_lock
218
        with self.lock_read():
219
            conflicts = _mod_conflicts.ConflictList()
220
            for conflicted in self._iter_conflicts():
221
                text = True
222
                try:
223
                    if osutils.file_kind(self.abspath(conflicted)) != "file":
224
                        text = False
225
                except errors.NoSuchFile:
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
226
                    text = False
6754.8.16 by Jelmer Vernooij
Get rid of all uses of needs_read_lock
227
                if text is True:
228
                    for suffix in ('.THIS', '.OTHER'):
229
                        try:
7143.15.2 by Jelmer Vernooij
Run autopep8.
230
                            kind = osutils.file_kind(
231
                                self.abspath(conflicted + suffix))
6754.8.16 by Jelmer Vernooij
Get rid of all uses of needs_read_lock
232
                            if kind != "file":
233
                                text = False
234
                        except errors.NoSuchFile:
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
235
                            text = False
7183.3.1 by Martin
Fix E71* lint errors
236
                        if text is False:
6754.8.16 by Jelmer Vernooij
Get rid of all uses of needs_read_lock
237
                            break
7143.15.2 by Jelmer Vernooij
Run autopep8.
238
                ctype = {True: 'text conflict',
239
                         False: 'contents conflict'}[text]
6754.8.16 by Jelmer Vernooij
Get rid of all uses of needs_read_lock
240
                conflicts.append(_mod_conflicts.Conflict.factory(ctype,
7143.15.2 by Jelmer Vernooij
Run autopep8.
241
                                                                 path=conflicted,
242
                                                                 file_id=self.path2id(conflicted)))
6754.8.16 by Jelmer Vernooij
Get rid of all uses of needs_read_lock
243
            return conflicts
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
244
5816.5.5 by Jelmer Vernooij
Fix conflict handling for wt2.
245
    def set_conflicts(self, arg):
246
        raise errors.UnsupportedOperation(self.set_conflicts, self)
5697.1.1 by Jelmer Vernooij
Move WorkingTreeFormat2 to a separate file.
247
5816.5.5 by Jelmer Vernooij
Fix conflict handling for wt2.
248
    def add_conflicts(self, arg):
249
        raise errors.UnsupportedOperation(self.add_conflicts, self)