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