/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to server.py

Support 'bzr serve --git'.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
import os
18
18
import tempfile
19
19
 
 
20
from dulwich.server import TCPGitServer
 
21
import os
 
22
 
20
23
from bzrlib.bzrdir import (
21
24
    BzrDir,
 
25
    BzrDirFormat,
22
26
    )
23
27
from bzrlib.repository import (
24
28
    Repository,
47
51
 
48
52
class BzrBackend(Backend):
49
53
 
50
 
    def __init__(self, directory):
51
 
        self.directory = directory
 
54
    def __init__(self, transport):
 
55
        self.transport = transport
52
56
        self.mapping = default_mapping
53
57
 
54
58
    def get_refs(self):
55
59
        """ return a dict of all tags and branches in repository (and shas) """
56
60
        ret = {}
57
 
        repo_dir = BzrDir.open(self.directory)
58
 
        repo = repo_dir.open_repository()
59
 
        store = get_object_store(repo)
60
 
        branch = None
61
 
        for branch in repo.find_branches(using=True):
62
 
            #FIXME: Look for 'master' or 'trunk' in here, and set HEAD accordingly...
63
 
            #FIXME: Need to get branch path relative to its repository and use this instead of nick
64
 
            ret["refs/heads/"+branch.nick] = store._lookup_revision_sha1(branch.last_revision())
65
 
        if 'HEAD' not in ret and branch:
66
 
            ret['HEAD'] = store._lookup_revision_sha1(branch.last_revision())
 
61
        repo_dir = BzrDir.open_from_transport(self.transport)
 
62
        repo = repo_dir.find_repository()
 
63
        repo.lock_read()
 
64
        try:
 
65
            store = get_object_store(repo)
 
66
            branch = None
 
67
            for branch in repo.find_branches(using=True):
 
68
                #FIXME: Look for 'master' or 'trunk' in here, and set HEAD accordingly...
 
69
                #FIXME: Need to get branch path relative to its repository and use this instead of nick
 
70
                ret["refs/heads/"+branch.nick] = store._lookup_revision_sha1(branch.last_revision())
 
71
            if 'HEAD' not in ret and branch:
 
72
                ret['HEAD'] = store._lookup_revision_sha1(branch.last_revision())
 
73
        finally:
 
74
            repo.unlock()
67
75
        return ret
68
76
 
69
77
    def apply_pack(self, refs, read):
83
91
            for obj in pack.iterobjects():
84
92
                yield obj
85
93
 
86
 
        target = Repository.open(self.directory)
 
94
        target = Repository.open_from_transport(self.transport)
87
95
 
88
96
        target.lock_write()
89
97
        try:
98
106
        for oldsha, sha, ref in refs:
99
107
            if ref[:11] == 'refs/heads/':
100
108
                branch_nick = ref[11:]
 
109
                transport = self.transport.clone(branch_nick)
101
110
 
102
111
                try:
103
 
                    target_dir = BzrDir.open(self.directory + "/" + branch_nick)
 
112
                    target_dir = BzrDir.open_from_transport(transport)
104
113
                except:
105
 
                    target_dir = BzrDir.create(self.directory + "/" + branch_nick)
 
114
                    format = BzrDirFormat.get_default_format()
 
115
                    format.initialize_on_transport(transport)
106
116
 
107
117
                try:
108
118
                    target_branch = target_dir.open_branch()
114
124
 
115
125
    def fetch_objects(self, determine_wants, graph_walker, progress):
116
126
        """ yield git objects to send to client """
117
 
        repo = Repository.open(self.directory)
 
127
        bzrdir = BzrDir.open_from_transport(self.transport)
 
128
        repo = bzrdir.find_repository()
118
129
 
119
130
        # If this is a Git repository, just use the existing fetch_objects implementation.
120
131
        if getattr(repo, "fetch_objects", None) is not None:
121
132
            return repo.fetch_objects(determine_wants, graph_walker, None, progress)
122
133
 
123
134
        wants = determine_wants(self.get_refs())
124
 
 
125
135
        repo.lock_read()
126
 
        try:
127
 
            store = BazaarObjectStore(repo)
128
 
            have = store.find_missing_revisions(graph_walker)
129
 
            missing_sha1s = store.find_missing_objects(have, wants, progress)
130
 
            return self.object_store.iter_shas(missing_sha1s)
131
 
        finally:
132
 
            repo.unlock()
 
136
        store = BazaarObjectStore(repo)
 
137
        have = store.find_common_revisions(graph_walker)
 
138
        missing_sha1s = store.find_missing_objects(have, wants, progress)
 
139
        return store.iter_shas(missing_sha1s)
 
140
 
 
141
 
 
142
def serve_git(transport, host=None, port=None, inet=False):
 
143
    backend = BzrBackend(transport)
 
144
 
 
145
    server = TCPGitServer(backend, 'localhost')
 
146
    server.serve_forever()