# HG changeset patch
# User mason@suse.com
# Date 2006-04-04 23:00:40
# Node ID 1cbb14c048cb78d7621bcd7ab677ee6e0fd096f5
# Parent  ee96ca273f32f71343a6dba099d547526543b559

Reduce index memory usage by storing the bare string instead of tuples

Storing the tuple returned by struct.unpack significantly increases
the memory required to store the entire index in ram.  This patch
uses struct.unpack on demand instead.

diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -135,9 +135,9 @@ class lazyparser(object):
         for x in xrange(lend):
             if self.index[i + x] == None:
                 b = data[off : off + self.s]
-                e = struct.unpack(self.format, b)
-                self.index[i + x] = e
-                self.map[e[-1]] = i + x
+                self.index[i + x] = b
+                n = b[self.shaoffset:self.shaoffset + 20]
+                self.map[n] = i + x
             off += self.s
 
     def findnode(self, node):
@@ -218,7 +218,10 @@ class lazyindex(object):
         self.p.loadindex(pos)
         return self.p.index[pos]
     def __getitem__(self, pos):
-        return self.p.index[pos] or self.load(pos)
+        ret = self.p.index[pos] or self.load(pos)
+        if isinstance(ret, str):
+            ret = struct.unpack(self.p.indexformat, ret)
+        return ret
     def __setitem__(self, pos, item):
         self.p.index[pos] = item
     def __delitem__(self, pos):
@@ -242,11 +245,13 @@ class lazymap(object):
     def __iter__(self):
         yield nullid
         for i in xrange(self.p.l):
-            try:
-                yield self.p.index[i][-1]
-            except:
+            ret = self.p.index[i]
+            if not ret:
                 self.p.loadindex(i)
-                yield self.p.index[i][-1]
+                ret = self.p.index[i]
+            if isinstance(ret, str):
+                ret = struct.unpack(self.p.indexformat, ret)
+            yield ret[-1]
     def __getitem__(self, key):
         try:
             return self.p.map[key]