/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.700 by Jelmer Vernooij
Support committing to a git branch from a bzr working tree.
24
import os
0.200.405 by Jelmer Vernooij
More work on commit.
25
import stat
26
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
27
from bzrlib.repository import (
28
    CommitBuilder,
29
    )
30
31
from dulwich.objects import (
0.200.521 by Jelmer Vernooij
Abstract out kind mapping a bit, initial work on support tree-references.
32
    S_IFGITLINK,
0.200.459 by Jelmer Vernooij
Use new commit_tree function from dulwich.
33
    Blob,
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
34
    Commit,
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):
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.
52
        raise NotImplementedError(self.record_entry_contents)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
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.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.
73
        for (file_id, path, changed_content, versioned, parent, name, kind,
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
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.700 by Jelmer Vernooij
Support committing to a git branch from a bzr working tree.
97
            file_sha1 = workingtree.get_file_sha1(file_id, path[1])
98
            yield file_id, path[1], (file_sha1, os.lstat(workingtree.abspath(path[1])))
0.200.510 by Jelmer Vernooij
Fill in old entries.
99
        # Fill in entries that were not changed
100
        basis_tree = workingtree.basis_tree()
101
        assert basis_tree.get_revision_id() == basis_revid
102
        for path, entry in basis_tree.iter_entries_by_dir():
103
            if entry.kind not in ("file", "symlink"):
104
                continue
105
            if not path in self._blobs:
106
                blob = Blob()
107
                if entry.kind == "symlink":
108
                    blob.data = basis_tree.get_symlink_target(entry.file_id)
109
                else:
110
                    blob.data = basis_tree.get_file_text(entry.file_id)
111
                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.
112
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
113
    def finish_inventory(self):
0.200.510 by Jelmer Vernooij
Fill in old entries.
114
        # eliminate blobs that were removed
0.200.998 by Jelmer Vernooij
Don't modify dictionary during iteration.
115
        for path, entry in iter(self._blobs.items()):
0.200.510 by Jelmer Vernooij
Fill in old entries.
116
            if entry is None:
117
                del self._blobs[path]
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
118
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
119
    def _iterblobs(self):
120
        return ((path, sha, mode) for (path, (mode, sha)) in self._blobs.iteritems())
121
0.200.391 by Jelmer Vernooij
Fix syntax error.
122
    def commit(self, message):
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
123
        c = Commit()
0.200.650 by Jelmer Vernooij
Use standard names for lookup functions.
124
        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.
125
        c.tree = commit_tree(self.store, self._iterblobs())
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
126
        c.committer = self._committer
127
        c.author = self._revprops.get('author', self._committer)
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
128
        c.commit_time = int(self._timestamp)
129
        c.author_time = int(self._timestamp)
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
130
        c.commit_timezone = self._timezone
131
        c.author_timezone = self._timezone
0.200.737 by Jelmer Vernooij
Add helper function, always set encoding to utf-8.
132
        c.encoding = 'utf-8'
0.200.416 by Jelmer Vernooij
Use public properties to set git objects values.
133
        c.message = message.encode("utf-8")
0.200.509 by Jelmer Vernooij
Fix a bunch of bugs in commit, partially works now.
134
        self.store.add_object(c)
0.200.702 by Jelmer Vernooij
properly commit write group
135
        self._new_revision_id = self.repository.get_mapping().revision_id_foreign_to_bzr(c.id)
136
        self.repository.commit_write_group()
137
        return self._new_revision_id