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