/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.200.292 by Jelmer Vernooij
Fix formatting.
17
import os
0.217.45 by John Carr
Restore +x flag is file is executable
18
import stat
0.200.292 by Jelmer Vernooij
Fix formatting.
19
import tempfile
20
21
from bzrlib.bzrdir import (
22
    BzrDir,
23
    )
24
from bzrlib.inventory import (
25
    InventoryDirectory,
26
    InventoryFile,
27
    )
28
from bzrlib.osutils import (
29
    splitpath,
30
    )
31
from bzrlib.repository import (
32
    Repository,
33
    )
34
35
from bzrlib.plugins.git.fetch import (
36
    import_git_objects,
37
    )
38
from bzrlib.plugins.git.mapping import (
39
    default_mapping,
40
    inventory_to_tree_and_blobs,
41
    revision_to_commit,
42
    )
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
43
from bzrlib.plugins.git.object_store import (
44
    BazaarObjectStore,
45
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
46
47
from dulwich.server import (
48
    Backend,
49
    )
50
from dulwich.pack import (
51
    Pack,
52
    PackData,
53
    write_pack_index_v2,
54
    )
55
from dulwich.objects import (
56
    Blob,
57
    Commit,
58
    ShaFile,
59
    Tree,
60
    )
61
0.217.32 by John Carr
Dirtyness to help pass tests
62
0.217.1 by John Carr
Start stubbing out rewritten git-serve
63
class BzrBackend(Backend):
64
0.217.2 by John Carr
Fix missing imports. Update TCPGitServer instantiation to latest. BzrBackend needs to know which directory its repo is in.
65
    def __init__(self, directory):
66
        self.directory = directory
0.217.7 by John Carr
Create tips
67
        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.
68
0.217.1 by John Carr
Start stubbing out rewritten git-serve
69
    def get_refs(self):
70
        """ return a dict of all tags and branches in repository (and shas) """
0.217.12 by John Carr
Support ls-remote against bazaar
71
        ret = {}
72
        repo_dir = BzrDir.open(self.directory)
73
        repo = repo_dir.open_repository()
0.217.52 by John Carr
Have a head, any head
74
        branch = None
0.217.12 by John Carr
Support ls-remote against bazaar
75
        for branch in repo.find_branches(using=True):
0.217.52 by John Carr
Have a head, any head
76
            #FIXME: Look for 'master' or 'trunk' in here, and set HEAD accordingly...
0.217.12 by John Carr
Support ls-remote against bazaar
77
            #FIXME: Need to get branch path relative to its repository and use this instead of nick
0.200.449 by Jelmer Vernooij
Use BazaarObjectStore to find matching SHA1s for bzr revisions.
78
            rev, mapping = self.mapping.revision_id_bzr_to_foreign(branch.last_revision())
79
            ret["refs/heads/"+branch.nick] = rev
0.217.52 by John Carr
Have a head, any head
80
        if 'HEAD' not in ret and branch:
0.200.449 by Jelmer Vernooij
Use BazaarObjectStore to find matching SHA1s for bzr revisions.
81
            rev, mapping = self.mapping.revision_id_bzr_to_foreign(branch.last_revision())
82
            ret['HEAD'] = rev
0.217.12 by John Carr
Support ls-remote against bazaar
83
        return ret
0.217.1 by John Carr
Start stubbing out rewritten git-serve
84
85
    def apply_pack(self, refs, read):
86
        """ apply pack from client to current repository """
0.217.4 by John Carr
Easy bits of git pushing to bazaar
87
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)
88
        fd, path = tempfile.mkstemp(suffix=".pack")
89
        f = os.fdopen(fd, 'w')
0.217.6 by John Carr
Fix typos
90
        f.write(read())
0.217.5 by John Carr
Add a temporary hack to test pushing form git to bazaar
91
        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)
92
93
        p = PackData(path)
94
        entries = p.sorted_entries()
95
        write_pack_index_v2(path[:-5]+".idx", entries, p.calculate_checksum())
96
97
        def get_objects():
98
            pack = Pack(path[:-5])
99
            for obj in pack.iterobjects():
100
                yield obj
101
102
        target = Repository.open(self.directory)
103
104
        target.lock_write()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
105
        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)
106
            target.start_write_group()
107
            try:
108
                import_git_objects(target, self.mapping, iter(get_objects()))
109
            finally:
110
                target.commit_write_group()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
111
        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)
112
            target.unlock()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
113
0.217.7 by John Carr
Create tips
114
        for oldsha, sha, ref in refs:
115
            if ref[:11] == 'refs/heads/':
116
                branch_nick = ref[11:]
117
118
                try:
119
                    target_dir = BzrDir.open(self.directory + "/" + branch_nick)
120
                except:
121
                    target_dir = BzrDir.create(self.directory + "/" + branch_nick)
122
123
                try:
124
                    target_branch = target_dir.open_branch()
125
                except:
126
                    target_branch = target_dir.create_branch()
0.217.22 by John Carr
Fix whitespace
127
0.217.7 by John Carr
Create tips
128
                rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
0.217.22 by John Carr
Fix whitespace
129
                target_branch.generate_revision_history(rev_id)
0.217.7 by John Carr
Create tips
130
0.217.1 by John Carr
Start stubbing out rewritten git-serve
131
    def fetch_objects(self, determine_wants, graph_walker, progress):
132
        """ yield git objects to send to client """
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
133
        repo = Repository.open(self.directory)
134
135
        # If this is a Git repository, just use the existing fetch_objects implementation.
0.200.442 by Jelmer Vernooij
Fix trivial bug checking for git repositories.
136
        if getattr(repo, "fetch_objects", None) is not None:
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
137
            return repo.fetch_objects(determine_wants, graph_walker, None, progress)
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
138
0.217.12 by John Carr
Support ls-remote against bazaar
139
        wants = determine_wants(self.get_refs())
0.200.188 by Jelmer Vernooij
Merge dulwich.
140
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
141
        repo.lock_read()
142
        try:
0.200.454 by Jelmer Vernooij
Use ObjectStore.find_missing_objects in server.
143
            store = BazaarObjectStore(repo)
144
            missing_sha1s = store.find_missing_objects(wants, graphwalker, progress)
145
            return (len(missing_sha1s), iter(store.iter_shas(missing_sha1s)))
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
146
        finally:
147
            repo.unlock()