/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

Implement GitRepository.revision_graph_can_have_wrong_parents().

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
import os
18
 
import stat
19
18
import tempfile
20
19
 
 
20
from dulwich.server import TCPGitServer
 
21
import os
 
22
 
21
23
from bzrlib.bzrdir import (
22
24
    BzrDir,
23
 
    )
24
 
from bzrlib.inventory import (
25
 
    InventoryDirectory,
26
 
    InventoryFile,
27
 
    )
28
 
from bzrlib.osutils import (
29
 
    splitpath,
 
25
    BzrDirFormat,
30
26
    )
31
27
from bzrlib.repository import (
32
28
    Repository,
34
30
 
35
31
from bzrlib.plugins.git.fetch import (
36
32
    import_git_objects,
 
33
    BazaarObjectStore,
37
34
    )
38
35
from bzrlib.plugins.git.mapping import (
39
36
    default_mapping,
40
 
    inventory_to_tree_and_blobs,
41
 
    revision_to_commit,
42
37
    )
43
38
from bzrlib.plugins.git.object_store import (
44
 
    BazaarObjectStore,
 
39
    get_object_store
45
40
    )
46
41
 
47
42
from dulwich.server import (
52
47
    PackData,
53
48
    write_pack_index_v2,
54
49
    )
55
 
from dulwich.objects import (
56
 
    Blob,
57
 
    Commit,
58
 
    ShaFile,
59
 
    Tree,
60
 
    )
61
50
 
62
51
 
63
52
class BzrBackend(Backend):
64
53
 
65
 
    def __init__(self, directory):
66
 
        self.directory = directory
 
54
    def __init__(self, transport):
 
55
        self.transport = transport
67
56
        self.mapping = default_mapping
68
57
 
69
58
    def get_refs(self):
70
59
        """ return a dict of all tags and branches in repository (and shas) """
71
60
        ret = {}
72
 
        repo_dir = BzrDir.open(self.directory)
73
 
        repo = repo_dir.open_repository()
74
 
        branch = None
75
 
        for branch in repo.find_branches(using=True):
76
 
            #FIXME: Look for 'master' or 'trunk' in here, and set HEAD accordingly...
77
 
            #FIXME: Need to get branch path relative to its repository and use this instead of nick
78
 
            rev, mapping = self.mapping.revision_id_bzr_to_foreign(branch.last_revision())
79
 
            ret["refs/heads/"+branch.nick] = rev
80
 
        if 'HEAD' not in ret and branch:
81
 
            rev, mapping = self.mapping.revision_id_bzr_to_foreign(branch.last_revision())
82
 
            ret['HEAD'] = rev
 
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()
83
75
        return ret
84
76
 
85
77
    def apply_pack(self, refs, read):
99
91
            for obj in pack.iterobjects():
100
92
                yield obj
101
93
 
102
 
        target = Repository.open(self.directory)
 
94
        target = Repository.open_from_transport(self.transport)
103
95
 
104
96
        target.lock_write()
105
97
        try:
114
106
        for oldsha, sha, ref in refs:
115
107
            if ref[:11] == 'refs/heads/':
116
108
                branch_nick = ref[11:]
 
109
                transport = self.transport.clone(branch_nick)
117
110
 
118
111
                try:
119
 
                    target_dir = BzrDir.open(self.directory + "/" + branch_nick)
 
112
                    target_dir = BzrDir.open_from_transport(transport)
120
113
                except:
121
 
                    target_dir = BzrDir.create(self.directory + "/" + branch_nick)
 
114
                    format = BzrDirFormat.get_default_format()
 
115
                    format.initialize_on_transport(transport)
122
116
 
123
117
                try:
124
118
                    target_branch = target_dir.open_branch()
130
124
 
131
125
    def fetch_objects(self, determine_wants, graph_walker, progress):
132
126
        """ yield git objects to send to client """
133
 
        repo = Repository.open(self.directory)
 
127
        bzrdir = BzrDir.open_from_transport(self.transport)
 
128
        repo = bzrdir.find_repository()
134
129
 
135
130
        # If this is a Git repository, just use the existing fetch_objects implementation.
136
131
        if getattr(repo, "fetch_objects", None) is not None:
137
132
            return repo.fetch_objects(determine_wants, graph_walker, None, progress)
138
133
 
139
134
        wants = determine_wants(self.get_refs())
140
 
 
141
135
        repo.lock_read()
142
 
        try:
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)))
146
 
        finally:
147
 
            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()