/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,
24
    )
0.200.405 by Jelmer Vernooij
More work on commit.
25
import stat
26
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
27
from .. import (
0.386.1 by Jelmer Vernooij
Support signing commits.
28
    config as _mod_config,
29
    gpg,
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
30
    osutils,
0.200.1217 by Jelmer Vernooij
Support committing from a tree that does not have a basis tree.
31
    revision as _mod_revision,
32
    )
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
33
from ..errors import (
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
34
    BzrError,
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
35
    RootMissing,
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
36
    UnsupportedOperation,
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
37
    )
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
38
from ..repository import (
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
39
    CommitBuilder,
40
    )
6986.2.3 by Jelmer Vernooij
Merge trunk
41
from ..sixish import (
7018.3.2 by Jelmer Vernooij
Fix some git tests.
42
    viewitems,
43
    )
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
44
45
from dulwich.objects import (
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
46
    Blob,
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
47
    Commit,
48
    )
0.429.10 by Jelmer Vernooij
use new read_submodule_head from dulwich.
49
from dulwich.index import read_submodule_head
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
50
51
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
52
from .mapping import (
0.200.1762 by Jelmer Vernooij
Fix mode handling.
53
    object_mode,
0.200.1711 by Jelmer Vernooij
Fix up identifiers if no fullname is set.
54
    fix_person_identifier,
0.200.510 by Jelmer Vernooij
Fill in old entries.
55
    )
0.365.1 by Jelmer Vernooij
Add custom GitTree{Directory,File,Symlink}.
56
from .tree import entry_factory
0.200.510 by Jelmer Vernooij
Fill in old entries.
57
58
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
59
class SettingCustomFileIdsUnsupported(UnsupportedOperation):
60
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
61
    _fmt = ("Unable to store addition of file with custom file ids: "
62
            "%(file_ids)r")
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
63
64
    def __init__(self, file_ids):
65
        BzrError.__init__(self)
66
        self.file_ids = file_ids
67
68
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
69
class GitCommitBuilder(CommitBuilder):
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
70
    """Commit builder for Git repositories."""
71
72
    supports_record_entry_contents = False
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
73
74
    def __init__(self, *args, **kwargs):
75
        super(GitCommitBuilder, self).__init__(*args, **kwargs)
0.200.1667 by Jelmer Vernooij
Set random_revid and _new_revision_id properties.
76
        self.random_revid = True
0.200.1247 by Jelmer Vernooij
Validate revprops during commit.
77
        self._validate_revprops(self._revprops)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
78
        self.store = self.repository._git.object_store
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
79
        self._blobs = {}
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
80
        self._inv_delta = []
0.200.1229 by Jelmer Vernooij
Provide CommitBuilder.any_changes.
81
        self._any_changes = False
0.200.1328 by Jelmer Vernooij
More test fixes.
82
        self._override_fileids = {}
83
        self._mapping = self.repository.get_mapping()
0.200.1229 by Jelmer Vernooij
Provide CommitBuilder.any_changes.
84
85
    def any_changes(self):
86
        return self._any_changes
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
87
88
    def record_iter_changes(self, workingtree, basis_revid, iter_changes):
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
89
        seen_root = False
0.200.668 by Jelmer Vernooij
Fix some places where we were way too much memory for repositories with a large number of entries in the inventory and a large number of revisions.
90
        for (file_id, path, changed_content, versioned, parent, name, kind,
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
91
             executable) in iter_changes:
92
            if kind[1] in ("directory",):
7143.15.2 by Jelmer Vernooij
Run autopep8.
93
                self._inv_delta.append(
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
94
                    (path[0], path[1], file_id, entry_factory[kind[1]](
95
                        file_id, name[1], parent[1])))
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
96
                if kind[0] in ("file", "symlink"):
0.200.1665 by Jelmer Vernooij
Rename _matchingbzrdir to _matchingcnotroldir.
97
                    self._blobs[path[0].encode("utf-8")] = None
0.200.1719 by Jelmer Vernooij
Fix pointless test.
98
                    self._any_changes = True
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
99
                if path[1] == "":
100
                    seen_root = True
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
101
                continue
0.200.1719 by Jelmer Vernooij
Fix pointless test.
102
            self._any_changes = True
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
103
            if path[1] is None:
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
104
                self._inv_delta.append((path[0], path[1], file_id, None))
0.200.1665 by Jelmer Vernooij
Rename _matchingbzrdir to _matchingcnotroldir.
105
                self._blobs[path[0].encode("utf-8")] = None
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
106
                continue
0.200.1706 by Jelmer Vernooij
Improve KeyError.
107
            try:
108
                entry_kls = entry_factory[kind[1]]
109
            except KeyError:
110
                raise KeyError("unknown kind %s" % kind[1])
111
            entry = entry_kls(file_id, name[1], parent[1])
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
112
            if kind[1] == "file":
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
113
                entry.executable = executable[1]
114
                blob = Blob()
0.345.1 by Jelmer Vernooij
Fix handling of content reporting for symlinks.
115
                f, st = workingtree.get_file_with_stat(path[1], file_id)
116
                try:
117
                    blob.data = f.read()
118
                finally:
119
                    f.close()
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
120
                entry.text_size = len(blob.data)
121
                entry.text_sha1 = osutils.sha_string(blob.data)
122
                self.store.add_object(blob)
123
                sha = blob.id
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
124
            elif kind[1] == "symlink":
7143.15.2 by Jelmer Vernooij
Run autopep8.
125
                symlink_target = workingtree.get_symlink_target(
126
                    path[1], file_id)
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
127
                blob = Blob()
128
                blob.data = symlink_target.encode("utf-8")
129
                self.store.add_object(blob)
130
                sha = blob.id
131
                entry.symlink_target = symlink_target
0.345.1 by Jelmer Vernooij
Fix handling of content reporting for symlinks.
132
                st = None
0.200.521 by Jelmer Vernooij
Abstract out kind mapping a bit, initial work on support tree-references.
133
            elif kind[1] == "tree-reference":
0.429.21 by Jelmer Vernooij
Simplify submodule handling.
134
                sha = read_submodule_head(workingtree.abspath(path[1]))
7143.15.2 by Jelmer Vernooij
Run autopep8.
135
                reference_revision = workingtree.get_reference_revision(
136
                    path[1], file_id)
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
137
                entry.reference_revision = reference_revision
0.345.1 by Jelmer Vernooij
Fix handling of content reporting for symlinks.
138
                st = None
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
139
            else:
140
                raise AssertionError("Unknown kind %r" % kind[1])
0.200.1762 by Jelmer Vernooij
Fix mode handling.
141
            mode = object_mode(kind[1], executable[1])
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
142
            self._inv_delta.append((path[0], path[1], file_id, entry))
0.200.1348 by Jelmer Vernooij
Fix handling of file id map.
143
            encoded_new_path = path[1].encode("utf-8")
144
            self._blobs[encoded_new_path] = (mode, sha)
0.345.1 by Jelmer Vernooij
Fix handling of content reporting for symlinks.
145
            if st is not None:
146
                yield file_id, path[1], (entry.text_sha1, st)
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
147
            if self._mapping.generate_file_id(encoded_new_path) != file_id:
148
                self._override_fileids[encoded_new_path] = file_id
149
            else:
150
                self._override_fileids[encoded_new_path] = None
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
151
        if not seen_root and len(self.parents) == 0:
152
            raise RootMissing()
0.200.1217 by Jelmer Vernooij
Support committing from a tree that does not have a basis tree.
153
        if getattr(workingtree, "basis_tree", False):
154
            basis_tree = workingtree.basis_tree()
155
        else:
156
            if len(self.parents) == 0:
157
                basis_revid = _mod_revision.NULL_REVISION
158
            else:
159
                basis_revid = self.parents[0]
160
            basis_tree = self.repository.revision_tree(basis_revid)
0.200.510 by Jelmer Vernooij
Fill in old entries.
161
        # Fill in entries that were not changed
0.393.1 by Jelmer Vernooij
Avoid expensive bzr APIs in commit.
162
        for entry in basis_tree._iter_tree_contents(include_trees=False):
163
            if entry.path in self._blobs:
0.200.510 by Jelmer Vernooij
Fill in old entries.
164
                continue
0.393.1 by Jelmer Vernooij
Avoid expensive bzr APIs in commit.
165
            self._blobs[entry.path] = (entry.mode, entry.sha)
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
166
        if not self._lossy:
0.200.1328 by Jelmer Vernooij
More test fixes.
167
            try:
168
                fileid_map = dict(basis_tree._fileid_map.file_ids)
169
            except AttributeError:
170
                fileid_map = {}
7018.3.2 by Jelmer Vernooij
Fix some git tests.
171
            for path, file_id in viewitems(self._override_fileids):
172
                if not isinstance(path, bytes):
0.361.1 by Jelmer Vernooij
Don't use assert.
173
                    raise TypeError(path)
0.200.1348 by Jelmer Vernooij
Fix handling of file id map.
174
                if file_id is None:
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
175
                    if path in fileid_map:
176
                        del fileid_map[path]
0.200.1348 by Jelmer Vernooij
Fix handling of file id map.
177
                else:
7018.3.2 by Jelmer Vernooij
Fix some git tests.
178
                    if not isinstance(file_id, bytes):
0.361.1 by Jelmer Vernooij
Don't use assert.
179
                        raise TypeError(file_id)
0.200.1348 by Jelmer Vernooij
Fix handling of file id map.
180
                    fileid_map[path] = file_id
0.200.1328 by Jelmer Vernooij
More test fixes.
181
            if fileid_map:
182
                fileid_blob = self._mapping.export_fileid_map(fileid_map)
0.320.1 by Jelmer Vernooij
Don't set file ids unless different from default.
183
            else:
184
                fileid_blob = None
185
            if fileid_blob is not None:
0.333.1 by Jelmer Vernooij
Raise exception when unable to set file ids.
186
                if self._mapping.BZR_FILE_IDS_FILE is None:
187
                    raise SettingCustomFileIdsUnsupported(fileid_map)
188
                self.store.add_object(fileid_blob)
7143.15.2 by Jelmer Vernooij
Run autopep8.
189
                self._blobs[self._mapping.BZR_FILE_IDS_FILE] = (
190
                    stat.S_IFREG | 0o644, fileid_blob.id)
0.200.1328 by Jelmer Vernooij
More test fixes.
191
            else:
192
                self._blobs[self._mapping.BZR_FILE_IDS_FILE] = None
0.200.1145 by Jelmer Vernooij
reset new_inventory after record_iter_changes
193
        self.new_inventory = None
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
194
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
195
    def update_basis(self, tree):
196
        # Nothing to do here
197
        pass
0.200.1230 by Jelmer Vernooij
Provide CommitBuilder.get_basis_delta.
198
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
199
    def finish_inventory(self):
0.200.510 by Jelmer Vernooij
Fill in old entries.
200
        # eliminate blobs that were removed
7143.15.2 by Jelmer Vernooij
Run autopep8.
201
        self._blobs = {k: v for (k, v) in viewitems(
202
            self._blobs) if v is not None}
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
203
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
204
    def _iterblobs(self):
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
205
        return ((path, sha, mode) for (path, (mode, sha))
206
                in viewitems(self._blobs))
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
207
0.200.391 by Jelmer Vernooij
Fix syntax error.
208
    def commit(self, message):
0.200.1177 by Jelmer Vernooij
Check message for validity.
209
        self._validate_unicode_text(message, 'commit message')
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
210
        c = Commit()
7143.15.2 by Jelmer Vernooij
Run autopep8.
211
        c.parents = [self.repository.lookup_bzr_revision_id(
212
            revid)[0] for revid in self.parents]
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
213
        c.tree = commit_tree(self.store, self._iterblobs())
7018.3.2 by Jelmer Vernooij
Fix some git tests.
214
        encoding = self._revprops.pop(u'git-explicit-encoding', 'utf-8')
215
        c.encoding = encoding.encode('ascii')
216
        c.committer = fix_person_identifier(self._committer.encode(encoding))
7143.6.1 by Jelmer Vernooij
Support the 'authors' revprop when creating Git commits.
217
        try:
218
            author = self._revprops.pop('author')
219
        except KeyError:
220
            try:
221
                authors = self._revprops.pop('authors').splitlines()
222
            except KeyError:
223
                author = self._committer
224
            else:
225
                if len(authors) > 1:
226
                    raise Exception("Unable to convert multiple authors")
227
                elif len(authors) == 0:
228
                    author = self._committer
229
                else:
230
                    author = authors[0]
231
        c.author = fix_person_identifier(author.encode(encoding))
0.200.1709 by Jelmer Vernooij
Avoid encoding commit supplements.
232
        if self._revprops:
233
            raise NotImplementedError(self._revprops)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
234
        c.commit_time = int(self._timestamp)
235
        c.author_time = int(self._timestamp)
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
236
        c.commit_timezone = self._timezone
237
        c.author_timezone = self._timezone
7018.3.2 by Jelmer Vernooij
Fix some git tests.
238
        c.message = message.encode(encoding)
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
239
        if (self._config_stack.get('create_signatures') ==
240
                _mod_config.SIGN_ALWAYS):
0.386.1 by Jelmer Vernooij
Support signing commits.
241
            strategy = gpg.GPGStrategy(self._config_stack)
242
            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.
243
        self.store.add_object(c)
0.200.702 by Jelmer Vernooij
properly commit write group
244
        self.repository.commit_write_group()
0.200.1667 by Jelmer Vernooij
Set random_revid and _new_revision_id properties.
245
        self._new_revision_id = self._mapping.revision_id_foreign_to_bzr(c.id)
246
        return self._new_revision_id
0.200.1191 by Jelmer Vernooij
Implement CommitBuilder.revision_tree.
247
0.200.1225 by Jelmer Vernooij
provide explicit CommitBuilder.abort.
248
    def abort(self):
0.334.1 by Jelmer Vernooij
Improve transaction and write group handling.
249
        if self.repository.is_in_write_group():
250
            self.repository.abort_write_group()
0.200.1225 by Jelmer Vernooij
provide explicit CommitBuilder.abort.
251
0.200.1191 by Jelmer Vernooij
Implement CommitBuilder.revision_tree.
252
    def revision_tree(self):
253
        return self.repository.revision_tree(self._new_revision_id)
0.200.1678 by Jelmer Vernooij
Fix tests.
254
255
    def get_basis_delta(self):
0.396.1 by Jelmer Vernooij
Mark as not support per file revision recording.
256
        # TODO(jelmer): remove this logic when lp:~jelmer/brz/remaining lands
0.200.1700 by Jelmer Vernooij
Implement get_basis_delta.
257
        for (oldpath, newpath, file_id, entry) in self._inv_delta:
258
            if entry is not None:
259
                entry.revision = self._new_revision_id
260
        return self._inv_delta
261
262
    def update_basis_by_delta(self, revid, delta):
263
        pass