/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4070.5.1 by Martin Pool
BranchBuilder now takes a timestamp for commits
1
# Copyright (C) 2007, 2008, 2009 Canonical Ltd
2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
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
2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
16
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
17
"""Utility for create branches with particular contents."""
18
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
19
from . import (
6207.3.3 by jelmer at samba
Fix tests and the like.
20
    controldir,
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
21
    commit,
22
    errors,
5540.1.1 by Gary van der Merwe
Make ``BranchBuilder.build_snapshot`` accept parent_ids == ['null:'].
23
    revision,
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
24
    )
2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
25
26
27
class BranchBuilder(object):
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
28
    r"""A BranchBuilder aids creating Branches with particular shapes.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
29
2466.7.7 by Robert Collins
Document basic usage.
30
    The expected way to use BranchBuilder is to construct a
31
    BranchBuilder on the transport you want your branch on, and then call
32
    appropriate build_ methods on it to get the shape of history you want.
33
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
34
    This is meant as a helper for the test suite, not as a general class for
35
    real data.
36
2466.7.7 by Robert Collins
Document basic usage.
37
    For instance:
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
38
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
39
    >>> from breezy.transport.memory import MemoryTransport
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
40
    >>> builder = BranchBuilder(MemoryTransport("memory:///"))
41
    >>> builder.start_series()
6816.2.1 by Jelmer Vernooij
Migrate some build_snapshot code over to having revision_id as keyword argument.
42
    >>> builder.build_snapshot(None, [
6855.4.1 by Jelmer Vernooij
Yet more bees.
43
    ...     ('add', ('', b'root-id', 'directory', '')),
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
44
    ...     ('add', ('filename', b'f-id', 'file', b'content\n'))],
6855.4.1 by Jelmer Vernooij
Yet more bees.
45
    ...     revision_id=b'rev-id')
7479.2.1 by Jelmer Vernooij
Drop python2 support.
46
    b'rev-id'
6973.13.2 by Jelmer Vernooij
Fix some more tests.
47
    >>> builder.build_snapshot([b'rev-id'],
7142.1.1 by Jelmer Vernooij
Improve documentation for BranchBuilder.
48
    ...     [('modify', ('filename', b'new-content\n'))],
6855.4.1 by Jelmer Vernooij
Yet more bees.
49
    ...     revision_id=b'rev2-id')
7479.2.1 by Jelmer Vernooij
Drop python2 support.
50
    b'rev2-id'
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
51
    >>> builder.finish_series()
52
    >>> branch = builder.get_branch()
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
53
54
    :ivar _tree: This is a private member which is not meant to be modified by
55
        users of this class. While a 'series' is in progress, it should hold a
56
        MemoryTree with the contents of the last commit (ready to be modified
57
        by the next build_snapshot command) with a held write lock. Outside of
58
        a series in progress, it should be None.
2466.7.7 by Robert Collins
Document basic usage.
59
    """
2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
60
4476.3.59 by Andrew Bennetts
Undo changes that aren't needed anymore.
61
    def __init__(self, transport=None, format=None, branch=None):
2466.7.5 by Robert Collins
Better docstring for BranchBuilder.__init__.
62
        """Construct a BranchBuilder on transport.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
63
2466.7.5 by Robert Collins
Better docstring for BranchBuilder.__init__.
64
        :param transport: The transport the branch should be created on.
65
            If the path of the transport does not exist but its parent does
66
            it will be created.
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
67
        :param format: Either a BzrDirFormat, or the name of a format in the
6207.3.3 by jelmer at samba
Fix tests and the like.
68
            controldir format registry for the branch to be built.
4257.3.8 by Andrew Bennetts
Fix TestCase.make_branch_builder to make a branch in the specified format. Also add an interrepo test scenario for KnitPack1 -> KnitPack6RichRoot, which fails.
69
        :param branch: An already constructed branch to use.  This param is
70
            mutually exclusive with the transport and format params.
2466.7.5 by Robert Collins
Better docstring for BranchBuilder.__init__.
71
        """
4257.3.8 by Andrew Bennetts
Fix TestCase.make_branch_builder to make a branch in the specified format. Also add an interrepo test scenario for KnitPack1 -> KnitPack6RichRoot, which fails.
72
        if branch is not None:
73
            if format is not None:
74
                raise AssertionError(
75
                    "branch and format kwargs are mutually exclusive")
76
            if transport is not None:
77
                raise AssertionError(
78
                    "branch and transport kwargs are mutually exclusive")
79
            self._branch = branch
80
        else:
81
            if not transport.has('.'):
82
                transport.mkdir('.')
83
            if format is None:
84
                format = 'default'
85
            if isinstance(format, str):
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
86
                format = controldir.format_registry.make_controldir(format)
6207.3.3 by jelmer at samba
Fix tests and the like.
87
            self._branch = controldir.ControlDir.create_branch_convenience(
4257.3.8 by Andrew Bennetts
Fix TestCase.make_branch_builder to make a branch in the specified format. Also add an interrepo test scenario for KnitPack1 -> KnitPack6RichRoot, which fails.
88
                transport.base, format=format, force_new_tree=False)
3567.4.17 by John Arbash Meinel
Add the ability to define a series of commits, which allows us to hold open the locks.
89
        self._tree = None
2466.7.4 by Robert Collins
Add BranchBuilder.get_branch().
90
6225.1.1 by Jelmer Vernooij
Add parent_ids argument to BranchBuilder.build_commit.
91
    def build_commit(self, parent_ids=None, allow_leftmost_as_ghost=False,
92
                     **commit_kwargs):
4070.5.1 by Martin Pool
BranchBuilder now takes a timestamp for commits
93
        """Build a commit on the branch.
4070.4.12 by Martin Pool
Kill trailing whitespace
94
4070.5.1 by Martin Pool
BranchBuilder now takes a timestamp for commits
95
        This makes a commit with no real file content for when you only want
96
        to look at the revision graph structure.
97
98
        :param commit_kwargs: Arguments to pass through to commit, such as
99
             timestamp.
100
        """
6225.1.1 by Jelmer Vernooij
Add parent_ids argument to BranchBuilder.build_commit.
101
        if parent_ids is not None:
102
            if len(parent_ids) == 0:
103
                base_id = revision.NULL_REVISION
104
            else:
105
                base_id = parent_ids[0]
106
            if base_id != self._branch.last_revision():
7143.15.1 by Jelmer Vernooij
Fix style issues.
107
                self._move_branch_pointer(
108
                    base_id, allow_leftmost_as_ghost=allow_leftmost_as_ghost)
6883.8.1 by Jelmer Vernooij
Add Branch.create_memorytree.
109
        tree = self._branch.create_memorytree()
6969.3.1 by Jelmer Vernooij
Use context managers.
110
        with tree.lock_write():
6225.1.1 by Jelmer Vernooij
Add parent_ids argument to BranchBuilder.build_commit.
111
            if parent_ids is not None:
7143.15.1 by Jelmer Vernooij
Fix style issues.
112
                tree.set_parent_ids(
113
                    parent_ids,
6225.1.1 by Jelmer Vernooij
Add parent_ids argument to BranchBuilder.build_commit.
114
                    allow_leftmost_as_ghost=allow_leftmost_as_ghost)
2466.7.9 by Robert Collins
Return the commited revision id from BranchBuilder.build_commit to save later instrospection.
115
            tree.add('')
4070.5.1 by Martin Pool
BranchBuilder now takes a timestamp for commits
116
            return self._do_commit(tree, **commit_kwargs)
2466.7.6 by Robert Collins
Add BranchBuilder.build_commit.
117
5060.1.1 by Robert Collins
``bzrlib.branchbuilder.BranchBuilder.build_snapshot`` now accepts a
118
    def _do_commit(self, tree, message=None, message_callback=None, **kwargs):
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
119
        reporter = commit.NullCommitReporter()
5060.1.1 by Robert Collins
``bzrlib.branchbuilder.BranchBuilder.build_snapshot`` now accepts a
120
        if message is None and message_callback is None:
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
121
            message = u'commit %d' % (self._branch.revno() + 1,)
5060.1.1 by Robert Collins
``bzrlib.branchbuilder.BranchBuilder.build_snapshot`` now accepts a
122
        return tree.commit(message, message_callback=message_callback,
7143.15.1 by Jelmer Vernooij
Fix style issues.
123
                           reporter=reporter, **kwargs)
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
124
4324.3.1 by Robert Collins
When adding rich root data follow the standard revision graph rules, so it does not create 'inconstent parents'.
125
    def _move_branch_pointer(self, new_revision_id,
7143.15.1 by Jelmer Vernooij
Fix style issues.
126
                             allow_leftmost_as_ghost=False):
3567.4.10 by John Arbash Meinel
Clean up the build_snapshot api a bit.
127
        """Point self._branch to a different revision id."""
6969.3.1 by Jelmer Vernooij
Use context managers.
128
        with self._branch.lock_write():
3567.4.10 by John Arbash Meinel
Clean up the build_snapshot api a bit.
129
            # We don't seem to have a simple set_last_revision(), so we
130
            # implement it here.
131
            cur_revno, cur_revision_id = self._branch.last_revision_info()
4324.3.1 by Robert Collins
When adding rich root data follow the standard revision graph rules, so it does not create 'inconstent parents'.
132
            try:
133
                g = self._branch.repository.get_graph()
7143.15.1 by Jelmer Vernooij
Fix style issues.
134
                new_revno = g.find_distance_to_null(
135
                    new_revision_id, [(cur_revision_id, cur_revno)])
4324.3.1 by Robert Collins
When adding rich root data follow the standard revision graph rules, so it does not create 'inconstent parents'.
136
                self._branch.set_last_revision_info(new_revno, new_revision_id)
137
            except errors.GhostRevisionsHaveNoRevno:
138
                if not allow_leftmost_as_ghost:
139
                    raise
140
                new_revno = 1
3567.4.17 by John Arbash Meinel
Add the ability to define a series of commits, which allows us to hold open the locks.
141
        if self._tree is not None:
142
            # We are currently processing a series, but when switching branch
143
            # pointers, it is easiest to just create a new memory tree.
144
            # That way we are sure to have the right files-on-disk
145
            # We are cheating a little bit here, and locking the new tree
146
            # before the old tree is unlocked. But that way the branch stays
147
            # locked throughout.
6883.8.1 by Jelmer Vernooij
Add Branch.create_memorytree.
148
            new_tree = self._branch.create_memorytree()
3567.4.17 by John Arbash Meinel
Add the ability to define a series of commits, which allows us to hold open the locks.
149
            new_tree.lock_write()
150
            self._tree.unlock()
151
            self._tree = new_tree
152
153
    def start_series(self):
154
        """We will be creating a series of commits.
155
156
        This allows us to hold open the locks while we are processing.
157
158
        Make sure to call 'finish_series' when you are done.
159
        """
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
160
        if self._tree is not None:
161
            raise AssertionError('You cannot start a new series while a'
162
                                 ' series is already going.')
6883.8.1 by Jelmer Vernooij
Add Branch.create_memorytree.
163
        self._tree = self._branch.create_memorytree()
3567.4.17 by John Arbash Meinel
Add the ability to define a series of commits, which allows us to hold open the locks.
164
        self._tree.lock_write()
165
166
    def finish_series(self):
167
        """Call this after start_series to unlock the various objects."""
168
        self._tree.unlock()
169
        self._tree = None
3567.4.10 by John Arbash Meinel
Clean up the build_snapshot api a bit.
170
6816.2.1 by Jelmer Vernooij
Migrate some build_snapshot code over to having revision_id as keyword argument.
171
    def build_snapshot(self, parent_ids, actions, message=None, timestamp=None,
7143.15.1 by Jelmer Vernooij
Fix style issues.
172
                       allow_leftmost_as_ghost=False, committer=None,
173
                       timezone=None, message_callback=None, revision_id=None):
3567.4.10 by John Arbash Meinel
Clean up the build_snapshot api a bit.
174
        """Build a commit, shaped in a specific way.
175
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
176
        Most of the actions are self-explanatory.  'flush' is special action to
177
        break a series of actions into discrete steps so that complex changes
178
        (such as unversioning a file-id and re-adding it with a different kind)
179
        can be expressed in a way that will clearly work.
180
3567.4.10 by John Arbash Meinel
Clean up the build_snapshot api a bit.
181
        :param parent_ids: A list of parent_ids to use for the commit.
182
            It can be None, which indicates to use the last commit.
183
        :param actions: A list of actions to perform. Supported actions are:
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
184
            ('add', ('path', b'file-id', 'kind', b'content' or None))
185
            ('modify', ('path', b'new-content'))
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
186
            ('unversion', 'path')
3567.5.2 by John Arbash Meinel
'rename' is a supported action.
187
            ('rename', ('orig-path', 'new-path'))
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
188
            ('flush', None)
3567.4.15 by John Arbash Meinel
Allow setting the commit message.
189
        :param message: An optional commit message, if not supplied, a default
190
            commit message will be written.
5060.1.1 by Robert Collins
``bzrlib.branchbuilder.BranchBuilder.build_snapshot`` now accepts a
191
        :param message_callback: A message callback to use for the commit, as
192
            per mutabletree.commit.
4070.4.12 by Martin Pool
Kill trailing whitespace
193
        :param timestamp: If non-None, set the timestamp of the commit to this
4070.5.1 by Martin Pool
BranchBuilder now takes a timestamp for commits
194
            value.
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
195
        :param timezone: An optional timezone for timestamp.
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
196
        :param committer: An optional username to use for commit
4324.3.1 by Robert Collins
When adding rich root data follow the standard revision graph rules, so it does not create 'inconstent parents'.
197
        :param allow_leftmost_as_ghost: True if the leftmost parent should be
198
            permitted to be a ghost.
6816.2.1 by Jelmer Vernooij
Migrate some build_snapshot code over to having revision_id as keyword argument.
199
        :param revision_id: The handle for the new commit, can be None
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
200
        :return: The revision_id of the new commit
3567.4.10 by John Arbash Meinel
Clean up the build_snapshot api a bit.
201
        """
3567.4.8 by John Arbash Meinel
Add the ability to force a basis for a revision.
202
        if parent_ids is not None:
5540.2.1 by Gary van der Merwe
Allow for BranchBuilder.build_snapshot to accept parent_ids = [], rather than ['null:'].
203
            if len(parent_ids) == 0:
204
                base_id = revision.NULL_REVISION
205
            else:
206
                base_id = parent_ids[0]
3567.4.10 by John Arbash Meinel
Clean up the build_snapshot api a bit.
207
            if base_id != self._branch.last_revision():
7143.15.1 by Jelmer Vernooij
Fix style issues.
208
                self._move_branch_pointer(
209
                    base_id, allow_leftmost_as_ghost=allow_leftmost_as_ghost)
3567.4.10 by John Arbash Meinel
Clean up the build_snapshot api a bit.
210
3567.4.17 by John Arbash Meinel
Add the ability to define a series of commits, which allows us to hold open the locks.
211
        if self._tree is not None:
212
            tree = self._tree
213
        else:
6883.8.1 by Jelmer Vernooij
Add Branch.create_memorytree.
214
            tree = self._branch.create_memorytree()
6883.22.12 by Jelmer Vernooij
Fix test failure.
215
        with tree.lock_write():
5540.2.1 by Gary van der Merwe
Allow for BranchBuilder.build_snapshot to accept parent_ids = [], rather than ['null:'].
216
            if parent_ids is not None:
7143.15.1 by Jelmer Vernooij
Fix style issues.
217
                tree.set_parent_ids(
218
                    parent_ids,
4324.3.1 by Robert Collins
When adding rich root data follow the standard revision graph rules, so it does not create 'inconstent parents'.
219
                    allow_leftmost_as_ghost=allow_leftmost_as_ghost)
3567.4.7 by John Arbash Meinel
Revert back to using MemoryTree.mkdir() rather than creating the directory during add().
220
            # Unfortunately, MemoryTree.add(directory) just creates an
221
            # inventory entry. And the only public function to create a
222
            # directory is MemoryTree.mkdir() which creates the directory, but
223
            # also always adds it. So we have to use a multi-pass setup.
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
224
            pending = _PendingActions()
3567.4.1 by John Arbash Meinel
Initial work to have BranchBuilder allow us to do tree-shape work.
225
            for action, info in actions:
226
                if action == 'add':
227
                    path, file_id, kind, content = info
3567.4.7 by John Arbash Meinel
Revert back to using MemoryTree.mkdir() rather than creating the directory during add().
228
                    if kind == 'directory':
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
229
                        pending.to_add_directories.append((path, file_id))
3567.4.7 by John Arbash Meinel
Revert back to using MemoryTree.mkdir() rather than creating the directory during add().
230
                    else:
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
231
                        pending.to_add_files.append(path)
232
                        pending.to_add_file_ids.append(file_id)
233
                        pending.to_add_kinds.append(kind)
3567.4.7 by John Arbash Meinel
Revert back to using MemoryTree.mkdir() rather than creating the directory during add().
234
                        if content is not None:
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
235
                            pending.new_contents[path] = content
3567.4.3 by John Arbash Meinel
Add an action for modifying an existing file
236
                elif action == 'modify':
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
237
                    path, content = info
238
                    pending.new_contents[path] = content
3567.4.4 by John Arbash Meinel
Add the ability to 'unversion' files, and handle unknown actions.
239
                elif action == 'unversion':
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
240
                    pending.to_unversion_paths.add(info)
3567.5.1 by John Arbash Meinel
Implement rename_one on MemoryTree, and expose that in the Branch Builder
241
                elif action == 'rename':
242
                    from_relpath, to_relpath = info
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
243
                    pending.to_rename.append((from_relpath, to_relpath))
244
                elif action == 'flush':
245
                    self._flush_pending(tree, pending)
246
                    pending = _PendingActions()
3567.4.4 by John Arbash Meinel
Add the ability to 'unversion' files, and handle unknown actions.
247
                else:
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
248
                    raise ValueError('Unknown build action: "%s"' % (action,))
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
249
            self._flush_pending(tree, pending)
7143.15.1 by Jelmer Vernooij
Fix style issues.
250
            return self._do_commit(
251
                tree, message=message, rev_id=revision_id,
5060.1.1 by Robert Collins
``bzrlib.branchbuilder.BranchBuilder.build_snapshot`` now accepts a
252
                timestamp=timestamp, timezone=timezone, committer=committer,
253
                message_callback=message_callback)
3567.4.1 by John Arbash Meinel
Initial work to have BranchBuilder allow us to do tree-shape work.
254
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
255
    def _flush_pending(self, tree, pending):
7143.15.1 by Jelmer Vernooij
Fix style issues.
256
        """Flush the pending actions in 'pending', i.e. apply them to tree."""
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
257
        for path, file_id in pending.to_add_directories:
6008.2.4 by Andrew Bennetts
Add ('checkpoint', None) action to BranchBuilder.build_snapshot to allow complex set of adds/deletes/renames to work without reinventing TreeTransform.
258
            if path == '':
7143.15.1 by Jelmer Vernooij
Fix style issues.
259
                if tree.has_filename(path) \
260
                        and path in pending.to_unversion_paths:
6008.2.4 by Andrew Bennetts
Add ('checkpoint', None) action to BranchBuilder.build_snapshot to allow complex set of adds/deletes/renames to work without reinventing TreeTransform.
261
                    # We're overwriting this path, no need to unversion
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
262
                    pending.to_unversion_paths.discard(path)
6008.2.4 by Andrew Bennetts
Add ('checkpoint', None) action to BranchBuilder.build_snapshot to allow complex set of adds/deletes/renames to work without reinventing TreeTransform.
263
                # Special case, because the path already exists
264
                tree.add([path], [file_id], ['directory'])
265
            else:
266
                tree.mkdir(path, file_id)
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
267
        for from_relpath, to_relpath in pending.to_rename:
6008.2.4 by Andrew Bennetts
Add ('checkpoint', None) action to BranchBuilder.build_snapshot to allow complex set of adds/deletes/renames to work without reinventing TreeTransform.
268
            tree.rename_one(from_relpath, to_relpath)
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
269
        if pending.to_unversion_paths:
270
            tree.unversion(pending.to_unversion_paths)
7143.15.1 by Jelmer Vernooij
Fix style issues.
271
        tree.add(pending.to_add_files, pending.to_add_file_ids,
272
                 pending.to_add_kinds)
7479.2.1 by Jelmer Vernooij
Drop python2 support.
273
        for path, content in pending.new_contents.items():
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
274
            tree.put_file_bytes_non_atomic(path, content)
6008.2.4 by Andrew Bennetts
Add ('checkpoint', None) action to BranchBuilder.build_snapshot to allow complex set of adds/deletes/renames to work without reinventing TreeTransform.
275
2466.7.4 by Robert Collins
Add BranchBuilder.get_branch().
276
    def get_branch(self):
277
        """Return the branch created by the builder."""
278
        return self._branch
6008.2.4 by Andrew Bennetts
Add ('checkpoint', None) action to BranchBuilder.build_snapshot to allow complex set of adds/deletes/renames to work without reinventing TreeTransform.
279
280
6008.2.5 by Andrew Bennetts
Rename 'checkpoint' to 'flush', add some unit tests and more comments.
281
class _PendingActions(object):
282
    """Pending actions for build_snapshot to take.
283
284
    This is just a simple class to hold a bunch of the intermediate state of
285
    build_snapshot in single object.
286
    """
6008.2.4 by Andrew Bennetts
Add ('checkpoint', None) action to BranchBuilder.build_snapshot to allow complex set of adds/deletes/renames to work without reinventing TreeTransform.
287
288
    def __init__(self):
289
        self.to_add_directories = []
290
        self.to_add_files = []
291
        self.to_add_file_ids = []
292
        self.to_add_kinds = []
293
        self.new_contents = {}
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
294
        self.to_unversion_paths = set()
6008.2.4 by Andrew Bennetts
Add ('checkpoint', None) action to BranchBuilder.build_snapshot to allow complex set of adds/deletes/renames to work without reinventing TreeTransform.
295
        self.to_rename = []