mercurial/util.py
changeset 52918 e4552f135e35
parent 52915 fdae7c26d038
child 52924 c92f9edd362a
--- a/mercurial/util.py	Tue Jan 21 04:28:11 2025 +0100
+++ b/mercurial/util.py	Mon Jan 27 18:18:57 2025 +0100
@@ -2796,16 +2796,25 @@
         self.iter = splitbig(in_iter)
         self._queue = collections.deque()
         self._chunkoffset = 0
+        self._absolute_offset = 0
 
     def __iter__(self):
         while self._queue:
             chunk = self._queue.popleft()
             if self._chunkoffset:
-                yield chunk[self._chunkoffset :]
+                d = chunk[self._chunkoffset :]
             else:
-                yield chunk
+                d = chunk
+            self._absolute_offset += len(d)
+            yield d
             self._chunkoffset = 0
-        yield from self.iter
+        for d in self.iter:
+            self._absolute_offset += len(d)
+            yield d
+
+    def tell(self) -> int:
+        """tell how much data we have read so far"""
+        return self._absolute_offset
 
     def read(self, l=None):
         """Read L bytes of data from the iterator of chunks of data.
@@ -2813,7 +2822,9 @@
 
         If size parameter is omitted, read everything"""
         if l is None:
-            return b''.join(self.iter)
+            d = b''.join(self.iter)
+            self._absolute_offset += len(d)
+            return d
 
         left = l
         buf = []
@@ -2865,7 +2876,9 @@
                 self._chunkoffset += left
                 left -= chunkremaining
 
-        return b''.join(buf)
+        d = b''.join(buf)
+        self._absolute_offset += len(d)
+        return d
 
 
 def filechunkiter(f, size=131072, limit=None):