/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.358.2 by Jelmer Vernooij
Refresh copyright headers, add my email.
1
# Copyright (C) 2009-2018 Jelmer Vernooij <jelmer@jelmer.uk>
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
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
0.358.1 by Jelmer Vernooij
Fix FSF address.
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
16
0.200.405 by Jelmer Vernooij
More work on commit.
17
18
"""Support for committing in native Git working trees."""
19
0.200.1594 by Jelmer Vernooij
Use absolute_import everywhere.
20
from __future__ import absolute_import
0.200.405 by Jelmer Vernooij
More work on commit.
21
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
22
from dulwich.index import (
23
    commit_tree,
7490.133.9 by Jelmer Vernooij
More improvements to the Git transform implementation.
24
    read_submodule_head,
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
25
    )
0.200.405 by Jelmer Vernooij
More work on commit.
26
import stat
27
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
28
from .. import (
7206.2.1 by Jelmer Vernooij
Add support for --fixes in Git repositories.
29
    bugtracker,
0.386.1 by Jelmer Vernooij
Support signing commits.
30
    config as _mod_config,
31
    gpg,
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
32
    osutils,
0.200.1217 by Jelmer Vernooij
Support committing from a tree that does not have a basis tree.
33
    revision as _mod_revision,
34
    )
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
35
from ..errors import (
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
36
    BzrError,
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
37
    RootMissing,
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
38
    UnsupportedOperation,
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
39
    )
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
40
from ..repository import (
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
41
    CommitBuilder,
42
    )
6986.2.3 by Jelmer Vernooij
Merge trunk
43
from ..sixish import (
7018.3.2 by Jelmer Vernooij
Fix some git tests.
44
    viewitems,
45
    )
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
46
47
from dulwich.objects import (
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
48
    Blob,
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
49
    Commit,
50
    )
51
52
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
53
from .mapping import (
7490.70.1 by Jelmer Vernooij
Add functions for encoding/decoding git paths.
54
    encode_git_path,
0.200.1762 by Jelmer Vernooij
Fix mode handling.
55
    object_mode,
0.200.1711 by Jelmer Vernooij
Fix up identifiers if no fullname is set.
56
    fix_person_identifier,
0.200.510 by Jelmer Vernooij
Fill in old entries.
57
    )
0.365.1 by Jelmer Vernooij
Add custom GitTree{Directory,File,Symlink}.
58
from .tree import entry_factory
0.200.510 by Jelmer Vernooij
Fill in old entries.
59
60
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
61
class GitCommitBuilder(CommitBuilder):
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
62
    """Commit builder for Git repositories."""
63
64
    supports_record_entry_contents = False
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
65
66
    def __init__(self, *args, **kwargs):
67
        super(GitCommitBuilder, self).__init__(*args, **kwargs)
0.200.1667 by Jelmer Vernooij
Set random_revid and _new_revision_id properties.
68
        self.random_revid = True
0.200.1247 by Jelmer Vernooij
Validate revprops during commit.
69
        self._validate_revprops(self._revprops)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
70
        self.store = self.repository._git.object_store
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
71
        self._blobs = {}
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
72
        self._inv_delta = []
7467.4.12 by Jelmer Vernooij
Deal with renames during commit.
73
        self._deleted_paths = set()
0.200.1229 by Jelmer Vernooij
Provide CommitBuilder.any_changes.
74
        self._any_changes = False
0.200.1328 by Jelmer Vernooij
More test fixes.
75
        self._mapping = self.repository.get_mapping()
0.200.1229 by Jelmer Vernooij
Provide CommitBuilder.any_changes.
76
77
    def any_changes(self):
78
        return self._any_changes
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
79
80
    def record_iter_changes(self, workingtree, basis_revid, iter_changes):
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
81
        seen_root = False
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
82
        for change in iter_changes:
7490.133.25 by Jelmer Vernooij
More fixes.
83
            if change.kind == (None, None):
84
                # Ephemeral
85
                continue
7490.121.4 by Jelmer Vernooij
Don't rely on TreeChange having a file_id attribute.
86
            if change.versioned[0] and not change.copied:
87
                file_id = self._mapping.generate_file_id(change.path[0])
88
            elif change.versioned[1]:
89
                file_id = self._mapping.generate_file_id(change.path[1])
90
            else:
91
                file_id = None
92
            if change.path[1]:
93
                parent_id_new = self._mapping.generate_file_id(osutils.dirname(change.path[1]))
94
            else:
95
                parent_id_new = None
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
96
            if change.kind[1] in ("directory",):
7143.15.2 by Jelmer Vernooij
Run autopep8.
97
                self._inv_delta.append(
7490.121.4 by Jelmer Vernooij
Don't rely on TreeChange having a file_id attribute.
98
                    (change.path[0], change.path[1], file_id,
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
99
                     entry_factory[change.kind[1]](
7490.121.4 by Jelmer Vernooij
Don't rely on TreeChange having a file_id attribute.
100
                         file_id, change.name[1], parent_id_new)))
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
101
                if change.kind[0] in ("file", "symlink"):
7490.70.1 by Jelmer Vernooij
Add functions for encoding/decoding git paths.
102
                    self._blobs[encode_git_path(change.path[0])] = None
0.200.1719 by Jelmer Vernooij
Fix pointless test.
103
                    self._any_changes = True
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
104
                if change.path[1] == "":
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
105
                    seen_root = True
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
106
                continue
0.200.1719 by Jelmer Vernooij
Fix pointless test.
107
            self._any_changes = True
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
108
            if change.path[1] is None:
7490.121.4 by Jelmer Vernooij
Don't rely on TreeChange having a file_id attribute.
109
                self._inv_delta.append((change.path[0], change.path[1], file_id, None))
7490.70.1 by Jelmer Vernooij
Add functions for encoding/decoding git paths.
110
                self._deleted_paths.add(encode_git_path(change.path[0]))
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
111
                continue
0.200.1706 by Jelmer Vernooij
Improve KeyError.
112
            try:
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
113
                entry_kls = entry_factory[change.kind[1]]
0.200.1706 by Jelmer Vernooij
Improve KeyError.
114
            except KeyError:
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
115
                raise KeyError("unknown kind %s" % change.kind[1])
7490.121.4 by Jelmer Vernooij
Don't rely on TreeChange having a file_id attribute.
116
            entry = entry_kls(file_id, change.name[1], parent_id_new)
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
117
            if change.kind[1] == "file":
118
                entry.executable = change.executable[1]
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
119
                blob = Blob()
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
120
                f, st = workingtree.get_file_with_stat(change.path[1])
0.345.1 by Jelmer Vernooij
Fix handling of content reporting for symlinks.
121
                try:
122
                    blob.data = f.read()
123
                finally:
124
                    f.close()
7490.126.2 by Jelmer Vernooij
Stop populating text_sha1 in Git.
125
                sha = blob.id
7490.133.16 by Jelmer Vernooij
Merge refactor of conflict code.
126
                if st is not None:
127
                    entry.text_size = st.st_size
128
                else:
129
                    entry.text_size = len(blob.data)
7490.126.2 by Jelmer Vernooij
Stop populating text_sha1 in Git.
130
                entry.git_sha1 = sha
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
131
                self.store.add_object(blob)
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
132
            elif change.kind[1] == "symlink":
133
                symlink_target = workingtree.get_symlink_target(change.path[1])
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
134
                blob = Blob()
7490.70.1 by Jelmer Vernooij
Add functions for encoding/decoding git paths.
135
                blob.data = encode_git_path(symlink_target)
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
136
                self.store.add_object(blob)
137
                sha = blob.id
138
                entry.symlink_target = symlink_target
0.345.1 by Jelmer Vernooij
Fix handling of content reporting for symlinks.
139
                st = None
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
140
            elif change.kind[1] == "tree-reference":
141
                sha = read_submodule_head(workingtree.abspath(change.path[1]))
142
                reference_revision = workingtree.get_reference_revision(change.path[1])
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
143
                entry.reference_revision = reference_revision
0.345.1 by Jelmer Vernooij
Fix handling of content reporting for symlinks.
144
                st = None
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
145
            else:
7322.1.6 by Jelmer Vernooij
Use the new attributes on TreeChange.
146
                raise AssertionError("Unknown kind %r" % change.kind[1])
147
            mode = object_mode(change.kind[1], change.executable[1])
7490.121.4 by Jelmer Vernooij
Don't rely on TreeChange having a file_id attribute.
148
            self._inv_delta.append((change.path[0], change.path[1], file_id, entry))
7467.4.12 by Jelmer Vernooij
Deal with renames during commit.
149
            if change.path[0] is not None:
7490.70.1 by Jelmer Vernooij
Add functions for encoding/decoding git paths.
150
                self._deleted_paths.add(encode_git_path(change.path[0]))
151
            self._blobs[encode_git_path(change.path[1])] = (mode, sha)
0.345.1 by Jelmer Vernooij
Fix handling of content reporting for symlinks.
152
            if st is not None:
7490.126.2 by Jelmer Vernooij
Stop populating text_sha1 in Git.
153
                yield change.path[1], (entry.git_sha1, st)
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
154
        if not seen_root and len(self.parents) == 0:
155
            raise RootMissing()
0.200.1217 by Jelmer Vernooij
Support committing from a tree that does not have a basis tree.
156
        if getattr(workingtree, "basis_tree", False):
157
            basis_tree = workingtree.basis_tree()
158
        else:
159
            if len(self.parents) == 0:
160
                basis_revid = _mod_revision.NULL_REVISION
161
            else:
162
                basis_revid = self.parents[0]
163
            basis_tree = self.repository.revision_tree(basis_revid)
0.200.510 by Jelmer Vernooij
Fill in old entries.
164
        # Fill in entries that were not changed
0.393.1 by Jelmer Vernooij
Avoid expensive bzr APIs in commit.
165
        for entry in basis_tree._iter_tree_contents(include_trees=False):
166
            if entry.path in self._blobs:
0.200.510 by Jelmer Vernooij
Fill in old entries.
167
                continue
7467.4.12 by Jelmer Vernooij
Deal with renames during commit.
168
            if entry.path in self._deleted_paths:
169
                continue
0.393.1 by Jelmer Vernooij
Avoid expensive bzr APIs in commit.
170
            self._blobs[entry.path] = (entry.mode, entry.sha)
0.200.1145 by Jelmer Vernooij
reset new_inventory after record_iter_changes
171
        self.new_inventory = None
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
172
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
173
    def update_basis(self, tree):
174
        # Nothing to do here
175
        pass
0.200.1230 by Jelmer Vernooij
Provide CommitBuilder.get_basis_delta.
176
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
177
    def finish_inventory(self):
0.200.510 by Jelmer Vernooij
Fill in old entries.
178
        # eliminate blobs that were removed
7467.4.12 by Jelmer Vernooij
Deal with renames during commit.
179
        self._blobs = {k: v for (k, v) in viewitems(self._blobs)}
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
180
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
181
    def _iterblobs(self):
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
182
        return ((path, sha, mode) for (path, (mode, sha))
183
                in viewitems(self._blobs))
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
184
0.200.391 by Jelmer Vernooij
Fix syntax error.
185
    def commit(self, message):
0.200.1177 by Jelmer Vernooij
Check message for validity.
186
        self._validate_unicode_text(message, 'commit message')
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
187
        c = Commit()
7143.15.2 by Jelmer Vernooij
Run autopep8.
188
        c.parents = [self.repository.lookup_bzr_revision_id(
189
            revid)[0] for revid in self.parents]
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
190
        c.tree = commit_tree(self.store, self._iterblobs())
7018.3.2 by Jelmer Vernooij
Fix some git tests.
191
        encoding = self._revprops.pop(u'git-explicit-encoding', 'utf-8')
192
        c.encoding = encoding.encode('ascii')
193
        c.committer = fix_person_identifier(self._committer.encode(encoding))
7143.6.1 by Jelmer Vernooij
Support the 'authors' revprop when creating Git commits.
194
        try:
195
            author = self._revprops.pop('author')
196
        except KeyError:
197
            try:
198
                authors = self._revprops.pop('authors').splitlines()
199
            except KeyError:
200
                author = self._committer
201
            else:
202
                if len(authors) > 1:
203
                    raise Exception("Unable to convert multiple authors")
204
                elif len(authors) == 0:
205
                    author = self._committer
206
                else:
207
                    author = authors[0]
208
        c.author = fix_person_identifier(author.encode(encoding))
7206.2.2 by Jelmer Vernooij
Review comments.
209
        bugstext = self._revprops.pop('bugs', None)
210
        if bugstext is not None:
7206.2.1 by Jelmer Vernooij
Add support for --fixes in Git repositories.
211
            message += "\n"
212
            for url, status in bugtracker.decode_bug_urls(bugstext):
213
                if status == bugtracker.FIXED:
214
                    message += "Fixes: %s\n" % url
215
                elif status == bugtracker.RELATED:
216
                    message += "Bug: %s\n" % url
217
                else:
218
                    raise bugtracker.InvalidBugStatus(status)
0.200.1709 by Jelmer Vernooij
Avoid encoding commit supplements.
219
        if self._revprops:
220
            raise NotImplementedError(self._revprops)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
221
        c.commit_time = int(self._timestamp)
222
        c.author_time = int(self._timestamp)
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
223
        c.commit_timezone = self._timezone
224
        c.author_timezone = self._timezone
7018.3.2 by Jelmer Vernooij
Fix some git tests.
225
        c.message = message.encode(encoding)
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
226
        if (self._config_stack.get('create_signatures') ==
227
                _mod_config.SIGN_ALWAYS):
0.386.1 by Jelmer Vernooij
Support signing commits.
228
            strategy = gpg.GPGStrategy(self._config_stack)
229
            c.gpgsig = strategy.sign(c.as_raw_string(), gpg.MODE_DETACH)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
230
        self.store.add_object(c)
0.200.702 by Jelmer Vernooij
properly commit write group
231
        self.repository.commit_write_group()
0.200.1667 by Jelmer Vernooij
Set random_revid and _new_revision_id properties.
232
        self._new_revision_id = self._mapping.revision_id_foreign_to_bzr(c.id)
233
        return self._new_revision_id
0.200.1191 by Jelmer Vernooij
Implement CommitBuilder.revision_tree.
234
0.200.1225 by Jelmer Vernooij
provide explicit CommitBuilder.abort.
235
    def abort(self):
0.334.1 by Jelmer Vernooij
Improve transaction and write group handling.
236
        if self.repository.is_in_write_group():
237
            self.repository.abort_write_group()
0.200.1225 by Jelmer Vernooij
provide explicit CommitBuilder.abort.
238
0.200.1191 by Jelmer Vernooij
Implement CommitBuilder.revision_tree.
239
    def revision_tree(self):
240
        return self.repository.revision_tree(self._new_revision_id)
0.200.1678 by Jelmer Vernooij
Fix tests.
241
242
    def get_basis_delta(self):
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
243
        return self._inv_delta
244
245
    def update_basis_by_delta(self, revid, delta):
246
        pass