453
# FIXME: Never invalidates.
454
if not self._pack_cache:
455
self._update_pack_cache()
456
return self._pack_cache.values()
458
452
def _update_pack_cache(self):
459
for pack in self._load_packs():
460
self._pack_cache[pack._basename] = pack
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
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])
464
for basename in pack_files:
465
pack_name = basename + ".pack"
466
if basename not in self._pack_cache:
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)
474
pack_name, self.pack_transport.get(pack_name),
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()
462
488
def _pack_names(self):
478
def _load_packs(self):
480
for name in self._pack_names():
481
if name.startswith("pack-") and name.endswith(".pack"):
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)
488
pd = PackData(name, StringIO(contents), size=len(contents))
490
pd = PackData(name, self.pack_transport.get(name),
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]
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)
522
del self._pack_cache[os.path.basename(pack._basename)]
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
566
575
def add_thin_pack(self):