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