/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.910 by Jelmer Vernooij
update copyright years
1
# Copyright (C) 2009-2010 Jelmer Vernooij <jelmer@samba.org>
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
0.200.405 by Jelmer Vernooij
More work on commit.
17
18
"""Support for committing in native Git working trees."""
19
20
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
21
from dulwich.index import (
22
    commit_tree,
23
    )
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
24
import os
0.200.405 by Jelmer Vernooij
More work on commit.
25
import stat
26
0.200.1217 by Jelmer Vernooij
Support committing from a tree that does not have a basis tree.
27
from bzrlib import (
28
    revision as _mod_revision,
29
    )
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
30
from bzrlib.errors import (
31
    RootMissing,
32
    )
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
33
from bzrlib.repository import (
34
    CommitBuilder,
35
    )
36
37
from dulwich.objects import (
0.200.521 by Jelmer Vernooij
Abstract out kind mapping a bit, initial work on support tree-references.
38
    S_IFGITLINK,
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
39
    Blob,
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
40
    Commit,
41
    )
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
42
from dulwich.repo import Repo
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
43
44
0.200.510 by Jelmer Vernooij
Fill in old entries.
45
from bzrlib.plugins.git.mapping import (
46
    entry_mode,
47
    )
0.200.1324 by Jelmer Vernooij
More work on roundtripping support.
48
from bzrlib.plugins.git.roundtrip import (
49
    CommitSupplement,
50
    inject_bzr_metadata,
51
    )
0.200.510 by Jelmer Vernooij
Fill in old entries.
52
53
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
54
class GitCommitBuilder(CommitBuilder):
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
55
    """Commit builder for Git repositories."""
56
57
    supports_record_entry_contents = False
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
58
59
    def __init__(self, *args, **kwargs):
60
        super(GitCommitBuilder, self).__init__(*args, **kwargs)
0.200.1247 by Jelmer Vernooij
Validate revprops during commit.
61
        self._validate_revprops(self._revprops)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
62
        self.store = self.repository._git.object_store
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
63
        self._blobs = {}
0.200.1229 by Jelmer Vernooij
Provide CommitBuilder.any_changes.
64
        self._any_changes = False
0.200.1245 by Jelmer Vernooij
Raise AssertionError in GitCommitBuilder.get_basis_delta if deletes won't be recorded.
65
        self._will_record_deletes = False
0.200.1328 by Jelmer Vernooij
More test fixes.
66
        self._override_fileids = {}
67
        self._mapping = self.repository.get_mapping()
0.200.1229 by Jelmer Vernooij
Provide CommitBuilder.any_changes.
68
69
    def any_changes(self):
70
        return self._any_changes
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
71
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
72
    def record_entry_contents(self, ie, parent_invs, path, tree,
73
        content_summary):
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.
74
        raise NotImplementedError(self.record_entry_contents)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
75
0.200.1366 by Jelmer Vernooij
Support deletion of directories.
76
    def record_delete(self, kind, path, file_id):
0.200.1351 by Jelmer Vernooij
Fix some types.
77
        assert type(path) == str
0.200.1366 by Jelmer Vernooij
Support deletion of directories.
78
        if kind != 'directory':
79
            self._override_fileids[path] = None
80
            self._blobs[path] = None
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
81
        self._any_changes = True
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
82
83
    def record_iter_changes(self, workingtree, basis_revid, iter_changes):
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
84
        def link_sha1(path, file_id):
85
            blob = Blob()
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
86
            blob.data = workingtree.get_symlink_target(file_id, path).encode("utf-8")
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
87
            self.store.add_object(blob)
88
            return blob.id
89
        def text_sha1(path, file_id):
90
            blob = Blob()
91
            blob.data = workingtree.get_file_text(file_id, path)
92
            self.store.add_object(blob)
93
            return blob.id
94
        def treeref_sha1(path, file_id):
95
            return Repo.open(os.path.join(workingtree.basedir, path)).head()
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
96
        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.
97
        for (file_id, path, changed_content, versioned, parent, name, kind,
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
98
             executable) in iter_changes:
99
            if kind[1] in ("directory",):
100
                if kind[0] in ("file", "symlink"):
0.200.1366 by Jelmer Vernooij
Support deletion of directories.
101
                    self.record_delete(kind[0], path[0].encode("utf-8"), file_id)
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
102
                if path[1] == "":
103
                    seen_root = True
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
104
                continue
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
105
            if path[1] is None:
0.200.1366 by Jelmer Vernooij
Support deletion of directories.
106
                self.record_delete(kind[0], path[0].encode("utf-8"), file_id)
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
107
                continue
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
108
            if kind[1] == "file":
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
109
                mode = stat.S_IFREG
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
110
                sha = text_sha1(path[1], file_id)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
111
            elif kind[1] == "symlink":
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
112
                mode = stat.S_IFLNK
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
113
                sha = link_sha1(path[1], file_id)
0.200.521 by Jelmer Vernooij
Abstract out kind mapping a bit, initial work on support tree-references.
114
            elif kind[1] == "tree-reference":
115
                mode = S_IFGITLINK
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
116
                sha = treeref_sha1(path[1], file_id)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
117
            else:
118
                raise AssertionError("Unknown kind %r" % kind[1])
0.200.523 by Jelmer Vernooij
Fix undefined error.
119
            if executable[1]:
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
120
                mode |= 0111
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
121
            self._any_changes = True
0.200.1348 by Jelmer Vernooij
Fix handling of file id map.
122
            encoded_new_path = path[1].encode("utf-8")
123
            self._blobs[encoded_new_path] = (mode, sha)
0.200.700 by Jelmer Vernooij
Support committing to a git branch from a bzr working tree.
124
            file_sha1 = workingtree.get_file_sha1(file_id, path[1])
0.200.1256 by Jelmer Vernooij
Cope with files disappearing during commit.
125
            if file_sha1 is None:
126
                # File no longer exists
127
                if path[0] is not None:
0.200.1366 by Jelmer Vernooij
Support deletion of directories.
128
                    self.record_delete(kind[0], path[0].encode("utf-8"), file_id)
0.200.1256 by Jelmer Vernooij
Cope with files disappearing during commit.
129
                continue
0.200.1092 by Jelmer Vernooij
Avoid dependency on os.lstat.
130
            _, st = workingtree.get_file_with_stat(file_id, path[1])
131
            yield file_id, path[1], (file_sha1, st)
0.200.1348 by Jelmer Vernooij
Fix handling of file id map.
132
            self._override_fileids[encoded_new_path] = file_id
0.200.1144 by Jelmer Vernooij
Raise RootMissing if root not specified.
133
        if not seen_root and len(self.parents) == 0:
134
            raise RootMissing()
0.200.1217 by Jelmer Vernooij
Support committing from a tree that does not have a basis tree.
135
        if getattr(workingtree, "basis_tree", False):
136
            basis_tree = workingtree.basis_tree()
137
        else:
138
            if len(self.parents) == 0:
139
                basis_revid = _mod_revision.NULL_REVISION
140
            else:
141
                basis_revid = self.parents[0]
142
            basis_tree = self.repository.revision_tree(basis_revid)
0.200.510 by Jelmer Vernooij
Fill in old entries.
143
        # Fill in entries that were not changed
144
        for path, entry in basis_tree.iter_entries_by_dir():
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
145
            if entry.kind not in ("file", "symlink", "tree-reference"):
0.200.510 by Jelmer Vernooij
Fill in old entries.
146
                continue
147
            if not path in self._blobs:
148
                if entry.kind == "symlink":
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
149
                    blob = Blob()
0.200.1307 by Jelmer Vernooij
Formatting fixes, specify path to a couple more functions.
150
                    blob.data = basis_tree.get_symlink_target(entry.file_id,
151
                        path)
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
152
                    self._blobs[path.encode("utf-8")] = (entry_mode(entry), blob.id)
153
                elif entry.kind == "file":
154
                    blob = Blob()
0.200.1307 by Jelmer Vernooij
Formatting fixes, specify path to a couple more functions.
155
                    blob.data = basis_tree.get_file_text(entry.file_id, path)
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
156
                    self._blobs[path.encode("utf-8")] = (entry_mode(entry), blob.id)
157
                else:
0.200.1545 by Jelmer Vernooij
Some more test fixes.
158
                    (mode, sha) = workingtree._lookup_entry(path.encode("utf-8"), update_index=True)
0.200.1544 by Jelmer Vernooij
Hackishly fix tree references.
159
                    self._blobs[path.encode("utf-8")] = (sha, mode)
0.200.1329 by Jelmer Vernooij
Fix more tests.
160
        if not self._lossy and self._mapping.BZR_FILE_IDS_FILE is not None:
0.200.1328 by Jelmer Vernooij
More test fixes.
161
            try:
162
                fileid_map = dict(basis_tree._fileid_map.file_ids)
163
            except AttributeError:
164
                fileid_map = {}
0.200.1348 by Jelmer Vernooij
Fix handling of file id map.
165
            for path, file_id in self._override_fileids.iteritems():
166
                assert type(path) == str
167
                if file_id is None:
168
                    del fileid_map[path]
169
                else:
170
                    assert type(file_id) == str
171
                    fileid_map[path] = file_id
0.200.1328 by Jelmer Vernooij
More test fixes.
172
            if fileid_map:
173
                fileid_blob = self._mapping.export_fileid_map(fileid_map)
174
                self.store.add_object(fileid_blob)
175
                self._blobs[self._mapping.BZR_FILE_IDS_FILE] = (stat.S_IFREG | 0644, fileid_blob.id)
176
            else:
177
                self._blobs[self._mapping.BZR_FILE_IDS_FILE] = None
0.200.1145 by Jelmer Vernooij
reset new_inventory after record_iter_changes
178
        self.new_inventory = None
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
179
0.200.1230 by Jelmer Vernooij
Provide CommitBuilder.get_basis_delta.
180
    def get_basis_delta(self):
0.200.1245 by Jelmer Vernooij
Raise AssertionError in GitCommitBuilder.get_basis_delta if deletes won't be recorded.
181
        if not self._will_record_deletes:
182
            raise AssertionError
0.200.1230 by Jelmer Vernooij
Provide CommitBuilder.get_basis_delta.
183
        # FIXME
0.200.1235 by Jelmer Vernooij
Return dummy basis delta, for now.
184
        return []
0.200.1230 by Jelmer Vernooij
Provide CommitBuilder.get_basis_delta.
185
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
186
    def finish_inventory(self):
0.200.510 by Jelmer Vernooij
Fill in old entries.
187
        # eliminate blobs that were removed
0.200.998 by Jelmer Vernooij
Don't modify dictionary during iteration.
188
        for path, entry in iter(self._blobs.items()):
0.200.510 by Jelmer Vernooij
Fill in old entries.
189
            if entry is None:
190
                del self._blobs[path]
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
191
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
192
    def _iterblobs(self):
193
        return ((path, sha, mode) for (path, (mode, sha)) in self._blobs.iteritems())
194
0.200.391 by Jelmer Vernooij
Fix syntax error.
195
    def commit(self, message):
0.200.1177 by Jelmer Vernooij
Check message for validity.
196
        self._validate_unicode_text(message, 'commit message')
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
197
        c = Commit()
0.200.650 by Jelmer Vernooij
Use standard names for lookup functions.
198
        c.parents = [self.repository.lookup_bzr_revision_id(revid)[0] for revid in self.parents]
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
199
        c.tree = commit_tree(self.store, self._iterblobs())
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
200
        c.committer = self._committer
201
        c.author = self._revprops.get('author', self._committer)
0.200.1324 by Jelmer Vernooij
More work on roundtripping support.
202
        if c.author != c.committer:
203
            self._revprops.remove("author")
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
204
        c.commit_time = int(self._timestamp)
205
        c.author_time = int(self._timestamp)
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
206
        c.commit_timezone = self._timezone
207
        c.author_timezone = self._timezone
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
208
        c.encoding = 'utf-8'
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
209
        c.message = message.encode("utf-8")
0.200.1324 by Jelmer Vernooij
More work on roundtripping support.
210
        if not self._lossy:
211
            commit_supplement = CommitSupplement()
212
            commit_supplement.revision_id = self._new_revision_id
213
            commit_supplement.properties = self._revprops
214
            commit_supplement.explicit_parent_ids = self.parents
215
            if commit_supplement:
216
                c.message = inject_bzr_metadata(c.message, commit_supplement, "utf-8")
217
218
        assert len(c.id) == 40
0.200.1541 by Jelmer Vernooij
Fix lossy commit.
219
        if self._new_revision_id is None or self._lossy:
220
            self._new_revision_id = self._mapping.revision_id_foreign_to_bzr(c.id)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
221
        self.store.add_object(c)
0.200.702 by Jelmer Vernooij
properly commit write group
222
        self.repository.commit_write_group()
223
        return self._new_revision_id
0.200.1191 by Jelmer Vernooij
Implement CommitBuilder.revision_tree.
224
0.200.1225 by Jelmer Vernooij
provide explicit CommitBuilder.abort.
225
    def abort(self):
0.200.1229 by Jelmer Vernooij
Provide CommitBuilder.any_changes.
226
        self.repository.abort_write_group()
0.200.1225 by Jelmer Vernooij
provide explicit CommitBuilder.abort.
227
0.200.1227 by Jelmer Vernooij
Implement CommitBuilder.will_record_deletes.
228
    def will_record_deletes(self):
0.200.1245 by Jelmer Vernooij
Raise AssertionError in GitCommitBuilder.get_basis_delta if deletes won't be recorded.
229
        self._will_record_deletes = True
0.200.1227 by Jelmer Vernooij
Implement CommitBuilder.will_record_deletes.
230
0.200.1191 by Jelmer Vernooij
Implement CommitBuilder.revision_tree.
231
    def revision_tree(self):
232
        return self.repository.revision_tree(self._new_revision_id)