/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 shamap.py

  • Committer: Jelmer Vernooij
  • Date: 2009-12-13 18:52:18 UTC
  • mto: (0.255.3 perf)
  • mto: This revision was merged to the branch mainline in revision 6960.
  • Revision ID: jelmer@samba.org-20091213185218-tbufcg8if0aiycys
Add trivial index-based sha map.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
import bzrlib
27
27
from bzrlib import (
 
28
    index as _mod_index,
 
29
    osutils,
28
30
    trace,
29
31
    )
30
32
 
 
33
# Data stored in the cache:
 
34
# Git SHA -> Bazaar inventory entry / revision
 
35
# Bazaar file id / revision -> Git SHA
 
36
# Bazaar revision id -> Git SHA
 
37
 
31
38
 
32
39
def get_cache_dir():
33
40
    try:
121
128
        """List the SHA1s."""
122
129
        raise NotImplementedError(self.sha1s)
123
130
 
124
 
    def commit(self):
 
131
    def start_write_group(self):
 
132
        """Start writing changes."""
 
133
 
 
134
    def commit_write_group(self):
125
135
        """Commit any pending changes."""
126
136
 
 
137
    def abort_write_group(self):
 
138
        """Abort any pending changes."""
 
139
 
127
140
 
128
141
class DictGitShaMap(GitShaMap):
129
142
 
195
208
            return row[0].encode("utf-8")
196
209
        raise KeyError
197
210
 
198
 
    def commit(self):
 
211
    def commit_write_group(self):
199
212
        self.db.commit()
200
213
 
201
214
    def add_entries(self, entries):
321
334
    def lookup_commit(self, revid):
322
335
        return sha_to_hex(self.db["commit\0" + revid][:20])
323
336
 
324
 
    def commit(self):
325
 
        pass
326
 
 
327
337
    def add_entry(self, hexsha, type, type_data):
328
338
        """Add a new entry to the database.
329
339
        """
377
387
        for key in self.db.iterkeys():
378
388
            if key.startswith("git\0"):
379
389
                yield sha_to_hex(key[4:])
 
390
 
 
391
INDEX_FORMAT = 'bzr-git sha map version 1'
 
392
 
 
393
 
 
394
class IndexGitShaMap(GitShaMap):
 
395
    """SHA Map that uses the Bazaar Index API.
 
396
 
 
397
    Entries:
 
398
 
 
399
    "git <sha1>" -> "<type> <type-data1> <type-data2>"
 
400
    "commit revid" -> "<sha1> <tree-id>"
 
401
    "tree fileid revid" -> "<sha1>"
 
402
    "blob fileid revid" -> "<sha1>"
 
403
    """
 
404
 
 
405
    def __init__(self, transport=None):
 
406
        if transport is None:
 
407
            self._transport = None
 
408
        else:
 
409
            self._transport = transport
 
410
            try:
 
411
                format = self._transport.get_bytes('format')
 
412
            except bzrlib.errors.NoSuchFile:
 
413
                self._transport.put_bytes('format', INDEX_FORMAT)
 
414
            else:
 
415
                if format != INDEX_FORMAT:
 
416
                    trace.warning("SHA Map is incompatible (%s -> %s), rebuilding database.",
 
417
                                  format, INDEX_FORMAT)
 
418
                    raise KeyError
 
419
        self._index = _mod_index.CombinedGraphIndex([])
 
420
 
 
421
    @classmethod
 
422
    def from_repository(cls, repository):
 
423
        transport = getattr(repository, "_transport", None)
 
424
        if transport is not None:
 
425
            return cls(transport.clone('git'))
 
426
        from bzrlib.transport import get_transport
 
427
        return cls(get_transport(get_cache_dir()))
 
428
 
 
429
    def start_write_group(self):
 
430
        self._builder = _mod_index.GraphIndexBuilder(0, key_elements=3)
 
431
        self._name = osutils.sha()
 
432
 
 
433
    def commit_write_group(self):
 
434
        stream = self._builder.finish()
 
435
        name = self._name.hexdigest()
 
436
        size = self._transport.put_file(name, stream)
 
437
        index = _mod_index.GraphIndex(self._transport, name, size)
 
438
        self._index.insert_index(0, index)
 
439
        self._builder = None
 
440
        self._name = None
 
441
 
 
442
    def abort_write_group(self):
 
443
        self._builder = None
 
444
        self._name = None
 
445
 
 
446
    def lookup_commit(self, revid):
 
447
        entries = self._index.iter_entries([("commit", revid, None)])
 
448
        try:
 
449
            return entries.next()[2][:20]
 
450
        except StopIteration:
 
451
            raise KeyError
 
452
 
 
453
    def add_entry(self, hexsha, type, type_data):
 
454
        """Add a new entry to the database.
 
455
        """
 
456
        self._name.update(hexsha)
 
457
        if hexsha is None:
 
458
            hexsha = ""
 
459
        else:
 
460
            self._builder.add_node(("git", hexsha, "X"), " ".join((type, type_data[0], type_data[1])))
 
461
        if type == "commit":
 
462
            self._builder.add_node(("commit", type_data[0], "X"), " ".join((hexsha, type_data[1])))
 
463
        else:
 
464
            self._builder.add_node((type, type_data[0], type_data[1]), hexsha)
 
465
 
 
466
    def lookup_tree(self, fileid, revid):
 
467
        entries = self._index.iter_entries([("tree", fileid, revid)])
 
468
        try:
 
469
            sha = entries.next()[2]
 
470
        except StopIteration:
 
471
            raise KeyError
 
472
        else:
 
473
            if sha == "":
 
474
                return None
 
475
            else:
 
476
                return sha
 
477
 
 
478
    def lookup_blob(self, fileid, revid):
 
479
        entries = self._index.iter_entries([("blob", fileid, revid)])
 
480
        try:
 
481
            return entries.next()[2]
 
482
        except StopIteration:
 
483
            raise KeyError
 
484
 
 
485
    def lookup_git_sha(self, sha):
 
486
        if len(sha) == 20:
 
487
            sha = sha_to_hex(sha)
 
488
        entries = self._index.iter_entries([("git", sha, "X")])
 
489
        try:
 
490
            data = entries.next()[2].split(" ", 2)
 
491
        except StopIteration:
 
492
            raise KeyError
 
493
        else:
 
494
            return (data[0], (data[1], data[2]))
 
495
 
 
496
    def revids(self):
 
497
        """List the revision ids known."""
 
498
        for entry in self._index.iter_entries_prefix([("commit", None, None)]):
 
499
            yield entry[1][1]
 
500
 
 
501
    def sha1s(self):
 
502
        """List the SHA1s."""
 
503
        for entry in self._index.iter_entries_prefix([("git", None, None)]):
 
504
            yield entry[1][1]