~jelmer/debian/sid/bzr-git/new-upstream

« back to all changes in this revision

Viewing changes to transportgit.py

  • Committer: Jelmer Vernooij
  • Date: 2019-02-08 17:04:59 UTC
  • mfrom: (17.25.406)
  • Revision ID: jelmer@jelmer.uk-20190208170459-syso4wn6y040c1hn
New upstream snapshot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
from dulwich.object_store import (
35
35
    PackBasedObjectStore,
36
36
    PACKDIR,
 
37
    read_packs_file,
37
38
    )
38
39
from dulwich.pack import (
39
40
    MemoryPackIndex,
448
449
        finally:
449
450
            f.close()
450
451
 
451
 
    @property
452
 
    def packs(self):
453
 
        # FIXME: Never invalidates.
454
 
        if not self._pack_cache:
455
 
            self._update_pack_cache()
456
 
        return self._pack_cache.values()
457
 
 
458
452
    def _update_pack_cache(self):
459
 
        for pack in self._load_packs():
460
 
            self._pack_cache[pack._basename] = pack
 
453
        pack_files = set()
 
454
        pack_dir_contents = self._pack_names()
 
455
        for name in pack_dir_contents:
 
456
            if name.startswith("pack-") and name.endswith(".pack"):
 
457
                # verify that idx exists first (otherwise the pack was not yet
 
458
                # fully written)
 
459
                idx_name = os.path.splitext(name)[0] + ".idx"
 
460
                if idx_name in pack_dir_contents:
 
461
                    pack_files.add(os.path.splitext(name)[0])
 
462
 
 
463
        new_packs = []
 
464
        for basename in pack_files:
 
465
            pack_name = basename + ".pack"
 
466
            if basename not in self._pack_cache:
 
467
                try:
 
468
                    size = self.pack_transport.stat(pack_name).st_size
 
469
                except TransportNotPossible:
 
470
                    f = self.pack_transport.get(pack_name)
 
471
                    pd = PackData(pack_name, f)
 
472
                else:
 
473
                    pd = PackData(
 
474
                        pack_name, self.pack_transport.get(pack_name),
 
475
                        size=size)
 
476
                idxname = basename + ".idx"
 
477
                idx = load_pack_index_file(
 
478
                    idxname, self.pack_transport.get(idxname))
 
479
                pack = Pack.from_objects(pd, idx)
 
480
                pack._basename = basename
 
481
                self._pack_cache[basename] = pack
 
482
                new_packs.append(pack)
 
483
        # Remove disappeared pack files
 
484
        for f in set(self._pack_cache) - pack_files:
 
485
            self._pack_cache.pop(f).close()
 
486
        return new_packs
461
487
 
462
488
    def _pack_names(self):
463
489
        try:
475
501
                ret.append(name)
476
502
            return ret
477
503
 
478
 
    def _load_packs(self):
479
 
        ret = []
480
 
        for name in self._pack_names():
481
 
            if name.startswith("pack-") and name.endswith(".pack"):
482
 
                try:
483
 
                    size = self.pack_transport.stat(name).st_size
484
 
                except TransportNotPossible:
485
 
                    # FIXME: This reads the whole pack file at once
486
 
                    f = self.pack_transport.get(name)
487
 
                    contents = f.read()
488
 
                    pd = PackData(name, StringIO(contents), size=len(contents))
489
 
                else:
490
 
                    pd = PackData(name, self.pack_transport.get(name),
491
 
                            size=size)
492
 
                idxname = name.replace(".pack", ".idx")
493
 
                idx = load_pack_index_file(idxname, self.pack_transport.get(idxname))
494
 
                pack = Pack.from_objects(pd, idx)
495
 
                pack._basename = idxname[:-4]
496
 
                ret.append(pack)
497
 
        return ret
498
 
 
499
504
    def _iter_loose_objects(self):
500
505
        for base in self.transport.list_dir('.'):
501
506
            if len(base) != 2:
513
518
    def _remove_pack(self, pack):
514
519
        self.pack_transport.delete(pack.data.filename)
515
520
        self.pack_transport.delete(pack.index.filename)
 
521
        try:
 
522
            del self._pack_cache[os.path.basename(pack._basename)]
 
523
        except KeyError:
 
524
            pass
516
525
 
517
526
    def _get_loose_object(self, sha):
518
527
        path = '%s/%s' % self._split_loose_object(sha)
560
569
        idx = load_pack_index_file(basename+".idx", idxfile)
561
570
        final_pack = Pack.from_objects(p, idx)
562
571
        final_pack._basename = basename
563
 
        self._add_known_pack(basename, final_pack)
 
572
        self._add_cached_pack(basename, final_pack)
564
573
        return final_pack
565
574
 
566
575
    def add_thin_pack(self):