/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
1
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
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
17
"""Map from Git sha's to Bazaar objects."""
18
0.200.292 by Jelmer Vernooij
Fix formatting.
19
import os
20
0.200.228 by Jelmer Vernooij
Split out map.
21
import bzrlib
0.200.292 by Jelmer Vernooij
Fix formatting.
22
from bzrlib.errors import (
23
    NoSuchRevision,
24
    )
0.200.230 by Jelmer Vernooij
Implement sha cache.
25
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
26
0.200.228 by Jelmer Vernooij
Split out map.
27
def check_pysqlite_version(sqlite3):
28
    """Check that sqlite library is compatible.
29
30
    """
31
    if (sqlite3.sqlite_version_info[0] < 3 or 
32
            (sqlite3.sqlite_version_info[0] == 3 and 
33
             sqlite3.sqlite_version_info[1] < 3)):
34
        warning('Needs at least sqlite 3.3.x')
35
        raise bzrlib.errors.BzrError("incompatible sqlite library")
36
37
try:
38
    try:
39
        import sqlite3
40
        check_pysqlite_version(sqlite3)
41
    except (ImportError, bzrlib.errors.BzrError), e: 
42
        from pysqlite2 import dbapi2 as sqlite3
43
        check_pysqlite_version(sqlite3)
44
except:
45
    warning('Needs at least Python2.5 or Python2.4 with the pysqlite2 '
46
            'module')
47
    raise bzrlib.errors.BzrError("missing sqlite library")
48
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
49
50
class GitShaMap(object):
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
51
    """Git<->Bzr revision id mapping database."""
52
53
    def add_entry(self, sha, type, type_data):
54
        """Add a new entry to the database.
55
        """
56
        raise NotImplementedError(self.add_entry)
57
0.200.287 by Jelmer Vernooij
Skip tree sha's already in the git sha map.
58
    def lookup_tree(self, path, revid):
59
        """Lookup the SHA of a git tree."""
60
        raise NotImplementedError(self.lookup_tree)
61
0.230.2 by Jelmer Vernooij
Fix versionedfiles.
62
    def lookup_blob(self, fileid, revid):
63
        raise NotImplementedError(self.lookup_blob)
64
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
65
    def lookup_git_sha(self, sha):
66
        """Lookup a Git sha in the database.
67
68
        :param sha: Git object sha
69
        :return: (type, type_data) with type_data:
70
            revision: revid, tree sha
71
        """
72
        raise NotImplementedError(self.lookup_git_sha)
73
74
    def revids(self):
75
        """List the revision ids known."""
76
        raise NotImplementedError(self.revids)
77
78
    def commit(self):
79
        """Commit any pending changes."""
80
81
82
class DictGitShaMap(GitShaMap):
83
84
    def __init__(self):
85
        self.dict = {}
86
87
    def add_entry(self, sha, type, type_data):
88
        self.dict[sha] = (type, type_data)
89
90
    def lookup_git_sha(self, sha):
91
        return self.dict[sha]
92
0.200.287 by Jelmer Vernooij
Skip tree sha's already in the git sha map.
93
    def lookup_tree(self, path, revid):
94
        for k, v in self.dict.iteritems():
95
            if v == ("tree", (path, revid)):
96
                return k
97
        raise KeyError((path, revid))
98
0.230.2 by Jelmer Vernooij
Fix versionedfiles.
99
    def lookup_blob(self, fileid, revid):
100
        for k, v in self.dict.iteritems():
101
            if v == ("blob", (fileid, revid)):
102
                return k
103
        raise KeyError((fileid, revid))
104
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
105
    def revids(self):
106
        for key, (type, type_data) in self.dict.iteritems():
107
            if type == "commit":
0.200.262 by Jelmer Vernooij
Add tests for GitShaMap.
108
                yield type_data[0]
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
109
110
111
class SqliteGitShaMap(GitShaMap):
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
112
0.200.262 by Jelmer Vernooij
Add tests for GitShaMap.
113
    def __init__(self, transport=None):
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
114
        self.transport = transport
0.200.262 by Jelmer Vernooij
Add tests for GitShaMap.
115
        if transport is None:
116
            self.db = sqlite3.connect(":memory:")
117
        else:
118
            self.db = sqlite3.connect(
119
                os.path.join(self.transport.local_abspath("."), "git.db"))
0.200.230 by Jelmer Vernooij
Implement sha cache.
120
        self.db.executescript("""
121
        create table if not exists commits(sha1 text, revid text, tree_sha text);
122
        create index if not exists commit_sha1 on commits(sha1);
0.200.284 by Jelmer Vernooij
Add extra indexes.
123
        create unique index if not exists commit_revid on commits(revid);
0.200.230 by Jelmer Vernooij
Implement sha cache.
124
        create table if not exists blobs(sha1 text, fileid text, revid text);
125
        create index if not exists blobs_sha1 on blobs(sha1);
0.200.284 by Jelmer Vernooij
Add extra indexes.
126
        create unique index if not exists blobs_fileid_revid on blobs(fileid, revid);
0.200.232 by Jelmer Vernooij
Fix pull from remote branches.
127
        create table if not exists trees(sha1 text, path text, revid text);
0.200.230 by Jelmer Vernooij
Implement sha cache.
128
        create index if not exists trees_sha1 on trees(sha1);
0.200.284 by Jelmer Vernooij
Add extra indexes.
129
        create unique index if not exists trees_path_revid on trees(path, revid);
0.200.230 by Jelmer Vernooij
Implement sha cache.
130
""")
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
131
0.200.231 by Jelmer Vernooij
Partially fix pull.
132
    def _parent_lookup(self, revid):
133
        return self.db.execute("select sha1 from commits where revid = ?", (revid,)).fetchone()[0].encode("utf-8")
134
0.200.232 by Jelmer Vernooij
Fix pull from remote branches.
135
    def commit(self):
136
        self.db.commit()
137
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
138
    def add_entry(self, sha, type, type_data):
139
        """Add a new entry to the database.
140
        """
0.200.231 by Jelmer Vernooij
Partially fix pull.
141
        assert isinstance(type_data, tuple)
142
        assert isinstance(sha, str), "type was %r" % sha
0.200.230 by Jelmer Vernooij
Implement sha cache.
143
        if type == "commit":
144
            self.db.execute("replace into commits (sha1, revid, tree_sha) values (?, ?, ?)", (sha, type_data[0], type_data[1]))
145
        elif type == "blob":
146
            self.db.execute("replace into blobs (sha1, fileid, revid) values (?, ?, ?)", (sha, type_data[0], type_data[1]))
147
        elif type == "tree":
0.200.232 by Jelmer Vernooij
Fix pull from remote branches.
148
            self.db.execute("replace into trees (sha1, path, revid) values (?, ?, ?)", (sha, type_data[0], type_data[1]))
0.200.230 by Jelmer Vernooij
Implement sha cache.
149
        else:
150
            raise AssertionError("Unknown type %s" % type)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
151
0.200.287 by Jelmer Vernooij
Skip tree sha's already in the git sha map.
152
    def lookup_tree(self, path, revid):
153
        row = self.db.execute("select sha1 from trees where path = ? and revid = ?", (path,revid)).fetchone()
154
        if row is None:
155
            raise KeyError((path, revid))
156
        return row[0]
157
0.230.2 by Jelmer Vernooij
Fix versionedfiles.
158
    def lookup_blob(self, fileid, revid):
0.230.3 by Jelmer Vernooij
Fix blob lookup.
159
        row = self.db.execute("select sha1 from blobs where fileid = ? and revid = ?", (fileid, revid)).fetchone()
0.230.2 by Jelmer Vernooij
Fix versionedfiles.
160
        if row is None:
161
            raise KeyError((fileid, revid))
162
        return row[0]
163
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
164
    def lookup_git_sha(self, sha):
165
        """Lookup a Git sha in the database.
166
167
        :param sha: Git object sha
168
        :return: (type, type_data) with type_data:
169
            revision: revid, tree sha
170
        """
0.200.230 by Jelmer Vernooij
Implement sha cache.
171
        row = self.db.execute("select revid, tree_sha from commits where sha1 = ?", (sha,)).fetchone()
172
        if row is not None:
173
            return ("commit", row)
174
        row = self.db.execute("select fileid, revid from blobs where sha1 = ?", (sha,)).fetchone()
175
        if row is not None:
176
            return ("blob", row)
0.200.232 by Jelmer Vernooij
Fix pull from remote branches.
177
        row = self.db.execute("select path, revid from trees where sha1 = ?", (sha,)).fetchone()
0.200.230 by Jelmer Vernooij
Implement sha cache.
178
        if row is not None:
179
            return ("tree", row)
180
        raise KeyError(sha)
181
182
    def revids(self):
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
183
        """List the revision ids known."""
0.200.230 by Jelmer Vernooij
Implement sha cache.
184
        for row in self.db.execute("select revid from commits").fetchall():
185
            yield row[0]