# Maximum number of nested indirect references allowed in a snapshot.
MAX_RECURSION_DEPTH = 3
+# All segments which have been accessed this session.
+accessed_segments = set()
+
class Struct:
"""A class which merely acts as a data container.
@staticmethod
def parse_ref(refstr):
+ m = re.match(r"^zero\[(\d+)\+(\d+)\]$", refstr)
+ if m:
+ return ("zero", None, None, (int(m.group(1)), int(m.group(2))))
+
m = re.match(r"^([-0-9a-f]+)\/([0-9a-f]+)(\(\S+\))?(\[(\d+)\+(\d+)\])?$", refstr)
if not m: return
return (segment, object, checksum, slice)
def get_segment(self, segment):
+ accessed_segments.add(segment)
raw = self.store.lowlevel_open(segment + ".tar.gpg")
(input, output) = os.popen2("lbs-filter-gpg --decrypt")
f.close()
def load_object(self, segment, object):
+ accessed_segments.add(segment)
path = os.path.join(self.get_cachedir(), segment, object)
if not os.access(path, os.R_OK):
self.extract_segment(segment)
(segment, object, checksum, slice) = self.parse_ref(refstr)
+ if segment == "zero":
+ return "\0" * slice[1]
+
data = self.load_object(segment, object)
if checksum is not None: