/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
1
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
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.405 by Jelmer Vernooij
More work on commit.
24
import stat
25
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
26
from bzrlib.repository import (
27
    CommitBuilder,
28
    )
29
30
from dulwich.objects import (
0.200.521 by Jelmer Vernooij
Abstract out kind mapping a bit, initial work on support tree-references.
31
    S_IFGITLINK,
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
32
    Blob,
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
33
    Commit,
34
    Tree,
35
    )
36
37
0.200.510 by Jelmer Vernooij
Fill in old entries.
38
from bzrlib.plugins.git.mapping import (
39
    entry_mode,
40
    )
41
42
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
43
class GitCommitBuilder(CommitBuilder):
44
45
    def __init__(self, *args, **kwargs):
46
        super(GitCommitBuilder, self).__init__(*args, **kwargs)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
47
        self.store = self.repository._git.object_store
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
48
        self._blobs = {}
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
49
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
50
    def record_entry_contents(self, ie, parent_invs, path, tree,
51
        content_summary):
52
        raise NotImplementedError(self.record_entry_contents)        
53
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
54
    def record_delete(self, path, file_id):
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
55
        self._blobs[path] = None
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
56
        self._any_changes = True
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
57
58
    def record_iter_changes(self, workingtree, basis_revid, iter_changes):
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
59
        index = getattr(workingtree, "index", None)
60
        if index is not None:
61
            def index_sha1(path, file_id):
62
                return index.get_sha1(path.encode("utf-8"))
63
            text_sha1 = link_sha1 = index_sha1
64
        else:
65
            def link_sha1(path, file_id):
66
                blob = Blob()
67
                blob.data = workingtree.get_symlink_target(file_id)
68
                return blob.id
69
            def text_sha1(path, file_id):
70
                blob = Blob()
71
                blob.data = workingtree.get_file_text(file_id, path)
72
                return blob.id
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
73
        for (file_id, path, changed_content, versioned, parent, name, kind, 
74
             executable) in iter_changes:
75
            if kind[1] in ("directory",):
76
                if kind[0] in ("file", "symlink"):
77
                    self.record_delete(path[0], file_id)
78
                continue
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
79
            if path[1] is None:
80
                self.record_delete(path[0], file_id)
81
                continue
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
82
            if kind[1] == "file":
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
83
                mode = stat.S_IFREG
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
84
                sha = text_sha1(path[1], file_id)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
85
            elif kind[1] == "symlink":
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
86
                mode = stat.S_IFLNK
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
87
                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.
88
            elif kind[1] == "tree-reference":
89
                mode = S_IFGITLINK
90
                sha = "FIXME"
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
91
            else:
92
                raise AssertionError("Unknown kind %r" % kind[1])
0.200.523 by Jelmer Vernooij
Fix undefined error.
93
            if executable[1]:
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
94
                mode |= 0111
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
95
            self._any_changes = True
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
96
            self._blobs[path[1].encode("utf-8")] = (mode, sha)
0.200.405 by Jelmer Vernooij
More work on commit.
97
            yield file_id, path, (None, None)
0.200.510 by Jelmer Vernooij
Fill in old entries.
98
        # Fill in entries that were not changed
99
        basis_tree = workingtree.basis_tree()
100
        assert basis_tree.get_revision_id() == basis_revid
101
        for path, entry in basis_tree.iter_entries_by_dir():
102
            if entry.kind not in ("file", "symlink"):
103
                continue
104
            if not path in self._blobs:
105
                blob = Blob()
106
                if entry.kind == "symlink":
107
                    blob.data = basis_tree.get_symlink_target(entry.file_id)
108
                else:
109
                    blob.data = basis_tree.get_file_text(entry.file_id)
110
                self._blobs[path.encode("utf-8")] = (entry_mode(entry), blob.id)
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
111
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
112
    def finish_inventory(self):
0.200.510 by Jelmer Vernooij
Fill in old entries.
113
        # eliminate blobs that were removed
0.200.511 by Jelmer Vernooij
Fix removing entries.
114
        for path, entry in self._blobs.iteritems():
0.200.510 by Jelmer Vernooij
Fill in old entries.
115
            if entry is None:
116
                del self._blobs[path]
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
117
0.200.391 by Jelmer Vernooij
Fix syntax error.
118
    def commit(self, message):
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
119
        c = Commit()
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
120
        c.parents = [self.repository.lookup_git_revid(revid)[0] for revid in self.parents]
121
        c.tree = commit_tree(self.store, 
122
                [(path, sha, mode) for (path, (mode, sha)) in self._blobs.iteritems()])
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
123
        c.committer = self._committer
124
        c.author = self._revprops.get('author', self._committer)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
125
        c.commit_time = int(self._timestamp)
126
        c.author_time = int(self._timestamp)
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
127
        c.commit_timezone = self._timezone
128
        c.author_timezone = self._timezone
129
        c.message = message.encode("utf-8")
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
130
        self.store.add_object(c)
131
        return self.repository.get_mapping().revision_id_foreign_to_bzr(c.id)