bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
1  | 
# Copyright (C) 2006 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
 | 
|
| 
4183.7.1
by Sabin Iacob
 update FSF mailing address  | 
15  | 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
16  | 
|
17  | 
||
18  | 
"""Inter-object utility class."""
 | 
|
19  | 
||
20  | 
||
21  | 
class InterObject(object):  | 
|
22  | 
"""This class represents operations taking place between two objects.  | 
|
23  | 
||
24  | 
    Its instances have methods like join or copy_content or fetch, and contain
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
25  | 
    references to the source and target objects these operations can be
 | 
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
26  | 
    carried out between.
 | 
27  | 
||
28  | 
    Often we will provide convenience methods on the objects which carry out
 | 
|
29  | 
    operations with another of similar type - they will always forward to
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
30  | 
    a subclass of InterObject - i.e.
 | 
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
31  | 
    InterVersionedFile.get(other).method_name(parameters).
 | 
| 
1852.11.1
by Robert Collins
 Deprecate compare_trees and move its body to InterTree.changes_from.  | 
32  | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
33  | 
    If the source and target objects implement the locking protocol -
 | 
| 
1852.11.1
by Robert Collins
 Deprecate compare_trees and move its body to InterTree.changes_from.  | 
34  | 
    lock_read, lock_write, unlock, then the InterObject's lock_read,
 | 
35  | 
    lock_write and unlock methods may be used (optionally in conjunction with
 | 
|
36  | 
    the needs_read_lock and needs_write_lock decorators.)
 | 
|
| 
2241.1.4
by Martin Pool
 Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.  | 
37  | 
|
38  | 
    When looking for an inter, the most recently registered types are tested
 | 
|
39  | 
    first.  So typically the most generic and slowest InterObjects should be
 | 
|
40  | 
    registered first.
 | 
|
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
41  | 
    """
 | 
42  | 
||
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
43  | 
    # _optimisers = list()
 | 
44  | 
    # Each concrete InterObject type should have its own optimisers list.
 | 
|
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
45  | 
|
46  | 
def __init__(self, source, target):  | 
|
47  | 
"""Construct a default InterObject instance. Please use 'get'.  | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
48  | 
|
49  | 
        Only subclasses of InterObject should call
 | 
|
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
50  | 
        InterObject.__init__ - clients should call InterFOO.get where FOO
 | 
51  | 
        is the base type of the objects they are interacting between. I.e.
 | 
|
52  | 
        InterVersionedFile or InterRepository.
 | 
|
53  | 
        get() is a convenience class method which will create an optimised
 | 
|
54  | 
        InterFOO if possible.
 | 
|
55  | 
        """
 | 
|
56  | 
self.source = source  | 
|
57  | 
self.target = target  | 
|
58  | 
||
| 
1852.11.1
by Robert Collins
 Deprecate compare_trees and move its body to InterTree.changes_from.  | 
59  | 
def _double_lock(self, lock_source, lock_target):  | 
| 
1852.11.3
by Robert Collins
 Fix typo in inter.py.  | 
60  | 
"""Take out two locks, rolling back the first if the second throws."""  | 
| 
1852.11.1
by Robert Collins
 Deprecate compare_trees and move its body to InterTree.changes_from.  | 
61  | 
lock_source()  | 
62  | 
try:  | 
|
63  | 
lock_target()  | 
|
64  | 
except Exception:  | 
|
65  | 
            # we want to ensure that we don't leave source locked by mistake.
 | 
|
66  | 
            # and any error on target should not confuse source.
 | 
|
67  | 
self.source.unlock()  | 
|
68  | 
            raise
 | 
|
69  | 
||
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
70  | 
    @classmethod
 | 
71  | 
def get(klass, source, target):  | 
|
72  | 
"""Retrieve a Inter worker object for these objects.  | 
|
73  | 
||
74  | 
        :param source: the object to be the 'source' member of
 | 
|
75  | 
                       the InterObject instance.
 | 
|
76  | 
        :param target: the object to be the 'target' member of
 | 
|
77  | 
                       the InterObject instance.
 | 
|
78  | 
        If an optimised worker exists it will be used otherwise
 | 
|
79  | 
        a default Inter worker instance will be created.
 | 
|
80  | 
        """
 | 
|
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
81  | 
for provider in reversed(klass._optimisers):  | 
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
82  | 
if provider.is_compatible(source, target):  | 
83  | 
return provider(source, target)  | 
|
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
84  | 
return klass(source, target)  | 
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
85  | 
|
| 
1852.11.1
by Robert Collins
 Deprecate compare_trees and move its body to InterTree.changes_from.  | 
86  | 
def lock_read(self):  | 
87  | 
"""Take out a logical read lock.  | 
|
88  | 
||
89  | 
        This will lock the source branch and the target branch. The source gets
 | 
|
90  | 
        a read lock and the target a read lock.
 | 
|
91  | 
        """
 | 
|
92  | 
self._double_lock(self.source.lock_read, self.target.lock_read)  | 
|
93  | 
||
94  | 
def lock_write(self):  | 
|
95  | 
"""Take out a logical write lock.  | 
|
96  | 
||
97  | 
        This will lock the source branch and the target branch. The source gets
 | 
|
98  | 
        a read lock and the target a write lock.
 | 
|
99  | 
        """
 | 
|
100  | 
self._double_lock(self.source.lock_read, self.target.lock_write)  | 
|
101  | 
||
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
102  | 
    @classmethod
 | 
103  | 
def register_optimiser(klass, optimiser):  | 
|
104  | 
"""Register an InterObject optimiser."""  | 
|
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
105  | 
klass._optimisers.append(optimiser)  | 
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
106  | 
|
| 
1852.11.1
by Robert Collins
 Deprecate compare_trees and move its body to InterTree.changes_from.  | 
107  | 
def unlock(self):  | 
108  | 
"""Release the locks on source and target."""  | 
|
109  | 
try:  | 
|
110  | 
self.target.unlock()  | 
|
111  | 
finally:  | 
|
112  | 
self.source.unlock()  | 
|
113  | 
||
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
114  | 
    @classmethod
 | 
115  | 
def unregister_optimiser(klass, optimiser):  | 
|
116  | 
"""Unregister an InterObject optimiser."""  | 
|
117  | 
klass._optimisers.remove(optimiser)  |