/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.217.1 by John Carr
Start stubbing out rewritten git-serve
1
# Copyright (C) 2008 Canonical Ltd
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.217.7 by John Carr
Create tips
17
from bzrlib.bzrdir import BzrDir
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
18
from bzrlib.repository import Repository
0.217.15 by John Carr
Start traversing commits and inventories
19
from bzrlib.inventory import InventoryDirectory, InventoryFile
0.217.21 by John Carr
This is oh so nearly the right logic, but it is so going to explode...
20
from bzrlib.osutils import splitpath
0.217.4 by John Carr
Easy bits of git pushing to bazaar
21
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
22
from bzrlib.plugins.git.fetch import import_git_objects
0.217.7 by John Carr
Create tips
23
from bzrlib.plugins.git.mapping import default_mapping
24
0.217.1 by John Carr
Start stubbing out rewritten git-serve
25
from dulwich.server import Backend
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
26
from dulwich.pack import Pack, PackData, write_pack_index_v2
0.217.17 by John Carr
More gentle plumbing
27
from dulwich.objects import ShaFile, Commit, Tree, Blob
0.217.5 by John Carr
Add a temporary hack to test pushing form git to bazaar
28
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
29
import os, tempfile
0.217.1 by John Carr
Start stubbing out rewritten git-serve
30
31
class BzrBackend(Backend):
32
0.217.2 by John Carr
Fix missing imports. Update TCPGitServer instantiation to latest. BzrBackend needs to know which directory its repo is in.
33
    def __init__(self, directory):
34
        self.directory = directory
0.217.7 by John Carr
Create tips
35
        self.mapping = default_mapping
0.217.2 by John Carr
Fix missing imports. Update TCPGitServer instantiation to latest. BzrBackend needs to know which directory its repo is in.
36
0.217.1 by John Carr
Start stubbing out rewritten git-serve
37
    def get_refs(self):
38
        """ return a dict of all tags and branches in repository (and shas) """
0.217.12 by John Carr
Support ls-remote against bazaar
39
        ret = {}
40
        repo_dir = BzrDir.open(self.directory)
41
        repo = repo_dir.open_repository()
42
        for branch in repo.find_branches(using=True):
43
            #FIXME: Need to get branch path relative to its repository and use this instead of nick
44
            ret["refs/heads/"+branch.nick] = self.mapping.revision_id_bzr_to_foreign(branch.last_revision())
45
        return ret
0.217.1 by John Carr
Start stubbing out rewritten git-serve
46
47
    def apply_pack(self, refs, read):
48
        """ apply pack from client to current repository """
0.217.4 by John Carr
Easy bits of git pushing to bazaar
49
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
50
        fd, path = tempfile.mkstemp(suffix=".pack")
51
        f = os.fdopen(fd, 'w')
0.217.6 by John Carr
Fix typos
52
        f.write(read())
0.217.5 by John Carr
Add a temporary hack to test pushing form git to bazaar
53
        f.close()
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
54
55
        p = PackData(path)
56
        entries = p.sorted_entries()
57
        write_pack_index_v2(path[:-5]+".idx", entries, p.calculate_checksum())
58
59
        def get_objects():
60
            pack = Pack(path[:-5])
61
            for obj in pack.iterobjects():
62
                yield obj
63
64
        target = Repository.open(self.directory)
65
66
        target.lock_write()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
67
        try:
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
68
            target.start_write_group()
69
            try:
70
                import_git_objects(target, self.mapping, iter(get_objects()))
71
            finally:
72
                target.commit_write_group()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
73
        finally:
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
74
            target.unlock()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
75
0.217.7 by John Carr
Create tips
76
        for oldsha, sha, ref in refs:
77
            if ref[:11] == 'refs/heads/':
78
                branch_nick = ref[11:]
79
80
                try:
81
                    target_dir = BzrDir.open(self.directory + "/" + branch_nick)
82
                except:
83
                    target_dir = BzrDir.create(self.directory + "/" + branch_nick)
84
85
                try:
86
                    target_branch = target_dir.open_branch()
87
                except:
88
                    target_branch = target_dir.create_branch()
0.217.22 by John Carr
Fix whitespace
89
0.217.7 by John Carr
Create tips
90
                rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
0.217.22 by John Carr
Fix whitespace
91
                target_branch.generate_revision_history(rev_id)
0.217.7 by John Carr
Create tips
92
0.217.1 by John Carr
Start stubbing out rewritten git-serve
93
    def fetch_objects(self, determine_wants, graph_walker, progress):
94
        """ yield git objects to send to client """
0.217.12 by John Carr
Support ls-remote against bazaar
95
        wants = determine_wants(self.get_refs())
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
96
        commits_to_send = set([self.mapping.revision_id_foreign_to_bzr(w) for w in wants])
97
        rev_done = set()
98
99
        repo = Repository.open(self.directory)
0.217.22 by John Carr
Fix whitespace
100
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
101
        repo.lock_read()
102
        try:
103
            have = graph_walker.next()
104
            while have:
105
                rev_done.add(have)
106
                if repo.has_revision(self.mapping.revision_id_foregin_to_bzr(sha)):
107
                    graph_walker.ack(have)
108
                have = graph_walker.next()
109
110
            while commits_to_send:
0.217.15 by John Carr
Start traversing commits and inventories
111
                commit = commits_to_send.pop()
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
112
                if commit in rev_done:
113
                    continue
114
                rev_done.add(commit)
115
0.217.15 by John Carr
Start traversing commits and inventories
116
                rev = repo.get_revision(commit)
117
118
                commits_to_send.update([p for p in rev.parent_ids if not p in rev_done])
119
0.217.25 by John Carr
Lets test commit gen
120
                #for obj in inventory_to_tree_and_blobs(repo.get_inventory(commit)):
121
                #    yield obj
0.217.15 by John Carr
Start traversing commits and inventories
122
0.217.26 by John Carr
Fix typos
123
                yield revision_to_commit(rev, self.mapping, "0"*40)
0.217.15 by John Carr
Start traversing commits and inventories
124
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
125
        finally:
126
            repo.unlock()
0.217.15 by John Carr
Start traversing commits and inventories
127
128
0.217.25 by John Carr
Lets test commit gen
129
def revision_to_commit(rev, mapping, tree_sha):
130
    """
131
    Turn a Bazaar revision in to a Git commit
132
    :param tree_sha: HACK parameter (until we can retrieve this from the mapping)
133
    :return dulwich.objects.Commit represent the revision:
134
    """
0.217.15 by John Carr
Start traversing commits and inventories
135
    commit = Commit()
0.217.26 by John Carr
Fix typos
136
    commit._tree = tree_sha
0.217.23 by John Carr
Reconstitute the commit object
137
    for p in rev.parent_ids:
0.217.26 by John Carr
Fix typos
138
        commit._parents.append(mapping.revision_id_bzr_to_foreign(p))
0.217.23 by John Carr
Reconstitute the commit object
139
    commit._message = rev.message
140
    commit._committer = rev.committer
141
    if 'author' in rev.properties:
142
        commit._author = rev.properties['author']
143
    else:
144
        commit._author = rev.committer
0.217.26 by John Carr
Fix typos
145
    commit._commit_time = rev.timestamp
0.217.21 by John Carr
This is oh so nearly the right logic, but it is so going to explode...
146
    commit.serialize()
0.217.15 by John Carr
Start traversing commits and inventories
147
    return commit
148
0.217.16 by John Carr
Tweak
149
def inventory_to_tree_and_blobs(inv):
0.217.20 by John Carr
Refactor to track Tree objects as we iterate over inventory
150
    stack = []
151
    cur = ""
152
    tree = Tree()
0.217.15 by John Carr
Start traversing commits and inventories
153
154
    for path, entry in inv.iter_entries():
0.217.20 by John Carr
Refactor to track Tree objects as we iterate over inventory
155
        while stack and not path.startswith(cur):
156
            tree.serialize()
157
            yield tree
0.217.21 by John Carr
This is oh so nearly the right logic, but it is so going to explode...
158
            t = (0, splitpath(cur)[:-1], tree.sha().hexdigest())
159
            cur, tree = stack.pop()
160
            tree.append(t)
0.217.15 by John Carr
Start traversing commits and inventories
161
162
        if type(entry) == InventoryDirectory:
0.217.20 by John Carr
Refactor to track Tree objects as we iterate over inventory
163
            stack.append((cur, tree))
164
            cur = path
165
            tree = Tree()
0.217.15 by John Carr
Start traversing commits and inventories
166
167
        if type(entry) == InventoryFile:
0.217.17 by John Carr
More gentle plumbing
168
            blob = Blob()
0.217.18 by John Carr
Crappy blob objects
169
            blob._text = "file contents k thx"
0.217.17 by John Carr
More gentle plumbing
170
            yield blob
0.217.15 by John Carr
Start traversing commits and inventories
171
0.217.21 by John Carr
This is oh so nearly the right logic, but it is so going to explode...
172
            name = splitpath(path)[:-1]
173
            mode = 0 # FIXME: Arrrgh crap - bzr cant hold this?
174
            tree.add((0, name, blob.sha().hexdigest()))
175
0.217.20 by John Carr
Refactor to track Tree objects as we iterate over inventory
176
    while stack:
177
        tree.serialize()
178
        yield tree
0.217.21 by John Carr
This is oh so nearly the right logic, but it is so going to explode...
179
        t = (0, splitpath(cur)[:-1], tree.sha().hexdigest())
180
        cur, tree = stack.pop()
181
        tree.append(t)
0.217.15 by John Carr
Start traversing commits and inventories
182