/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

Simply refer to bzr's docs in HACKING.

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
 
20
22
from bzrlib.bzrdir import (
21
23
    BzrDir,
 
24
    BzrDirFormat,
22
25
    )
23
26
from bzrlib.repository import (
24
27
    Repository,
47
50
 
48
51
class BzrBackend(Backend):
49
52
 
50
 
    def __init__(self, directory):
51
 
        self.directory = directory
 
53
    def __init__(self, transport):
 
54
        self.transport = transport
52
55
        self.mapping = default_mapping
53
56
 
54
57
    def get_refs(self):
55
58
        """ return a dict of all tags and branches in repository (and shas) """
56
59
        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())
 
60
        repo_dir = BzrDir.open_from_transport(self.transport)
 
61
        repo = repo_dir.find_repository()
 
62
        repo.lock_read()
 
63
        try:
 
64
            store = get_object_store(repo)
 
65
            branch = None
 
66
            for branch in repo.find_branches(using=True):
 
67
                #FIXME: Look for 'master' or 'trunk' in here, and set HEAD accordingly...
 
68
                #FIXME: Need to get branch path relative to its repository and use this instead of nick
 
69
                ret["refs/heads/"+branch.nick] = store._lookup_revision_sha1(branch.last_revision())
 
70
            if 'HEAD' not in ret and branch:
 
71
                ret['HEAD'] = store._lookup_revision_sha1(branch.last_revision())
 
72
        finally:
 
73
            repo.unlock()
67
74
        return ret
68
75
 
69
76
    def apply_pack(self, refs, read):
83
90
            for obj in pack.iterobjects():
84
91
                yield obj
85
92
 
86
 
        target = Repository.open(self.directory)
 
93
        target = Repository.open_from_transport(self.transport)
87
94
 
88
95
        target.lock_write()
89
96
        try:
98
105
        for oldsha, sha, ref in refs:
99
106
            if ref[:11] == 'refs/heads/':
100
107
                branch_nick = ref[11:]
 
108
                transport = self.transport.clone(branch_nick)
101
109
 
102
110
                try:
103
 
                    target_dir = BzrDir.open(self.directory + "/" + branch_nick)
 
111
                    target_dir = BzrDir.open_from_transport(transport)
104
112
                except:
105
 
                    target_dir = BzrDir.create(self.directory + "/" + branch_nick)
 
113
                    format = BzrDirFormat.get_default_format()
 
114
                    format.initialize_on_transport(transport)
106
115
 
107
116
                try:
108
117
                    target_branch = target_dir.open_branch()
114
123
 
115
124
    def fetch_objects(self, determine_wants, graph_walker, progress):
116
125
        """ yield git objects to send to client """
117
 
        repo = Repository.open(self.directory)
 
126
        bzrdir = BzrDir.open_from_transport(self.transport)
 
127
        repo = bzrdir.find_repository()
118
128
 
119
129
        # If this is a Git repository, just use the existing fetch_objects implementation.
120
130
        if getattr(repo, "fetch_objects", None) is not None:
121
131
            return repo.fetch_objects(determine_wants, graph_walker, None, progress)
122
132
 
123
133
        wants = determine_wants(self.get_refs())
124
 
 
 
134
        graph_walker.reset()
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()