##// END OF EJS Templates
store: add logic to group revlog file together...
marmoute -
r51372:5217e363 default
parent child Browse files
Show More
@@ -5,7 +5,7
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8
8 import collections
9 import functools
9 import functools
10 import os
10 import os
11 import re
11 import re
@@ -395,6 +395,13 REVLOG_FILES_OTHER_EXT = (
395 b'.nd',
395 b'.nd',
396 b'.sda',
396 b'.sda',
397 )
397 )
398 # file extension that also use a `-SOMELONGIDHASH.ext` form
399 REVLOG_FILES_LONG_EXT = (
400 b'.nd',
401 b'.idx',
402 b'.dat',
403 b'.sda',
404 )
398 # files that are "volatile" and might change between listing and streaming
405 # files that are "volatile" and might change between listing and streaming
399 #
406 #
400 # note: the ".nd" file are nodemap data and won't "change" but they might be
407 # note: the ".nd" file are nodemap data and won't "change" but they might be
@@ -532,6 +539,30 class StoreFile:
532 return 0
539 return 0
533
540
534
541
542 def _gather_revlog(files_data):
543 """group files per revlog prefix
544
545 The returns a two level nested dict. The top level key is the revlog prefix
546 without extension, the second level is all the file "suffix" that were
547 seen for this revlog and arbitrary file data as value.
548 """
549 revlogs = collections.defaultdict(dict)
550 for u, value in files_data:
551 name, ext = _split_revlog_ext(u)
552 revlogs[name][ext] = value
553 return sorted(revlogs.items())
554
555
556 def _split_revlog_ext(filename):
557 """split the revlog file prefix from the variable extension"""
558 if filename.endswith(REVLOG_FILES_LONG_EXT):
559 char = b'-'
560 else:
561 char = b'.'
562 idx = filename.rfind(char)
563 return filename[:idx], filename[idx:]
564
565
535 class basicstore:
566 class basicstore:
536 '''base class for local repository stores'''
567 '''base class for local repository stores'''
537
568
@@ -592,8 +623,10 class basicstore:
592 be a list and the filenames that can't be decoded are added
623 be a list and the filenames that can't be decoded are added
593 to it instead. This is very rarely needed."""
624 to it instead. This is very rarely needed."""
594 files = self._walk(b'data', True) + self._walk(b'meta', True)
625 files = self._walk(b'data', True) + self._walk(b'meta', True)
595 for u, (t, s) in files:
626 files = (f for f in files if f[1][0] is not None)
596 if t is not None:
627 for revlog, details in _gather_revlog(files):
628 for ext, (t, s) in sorted(details.items()):
629 u = revlog + ext
597 yield RevlogStoreEntry(
630 yield RevlogStoreEntry(
598 unencoded_path=u,
631 unencoded_path=u,
599 revlog_type=FILEFLAGS_FILELOG,
632 revlog_type=FILEFLAGS_FILELOG,
General Comments 0
You need to be logged in to leave comments. Login now