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