summaryrefslogtreecommitdiff
path: root/refs/log.py
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2010-11-24 19:36:34 +0100
committerSebastian Thiel <byronimo@gmail.com>2010-11-24 19:37:06 +0100
commit98a313305f0d554a179b93695d333199feb5266c (patch)
tree853a7029fa8c532da110b11afc2b60027e267625 /refs/log.py
parent86523260c495d9a29aa5ab29d50d30a5d1981a0c (diff)
downloadgitpython-98a313305f0d554a179b93695d333199feb5266c.tar.gz
RefLog: added entry_at method, which is a faster way of reading single entries, including test
Diffstat (limited to 'refs/log.py')
-rw-r--r--refs/log.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/refs/log.py b/refs/log.py
index 129803b4..6c734ad4 100644
--- a/refs/log.py
+++ b/refs/log.py
@@ -173,6 +173,37 @@ class RefLog(list, Serializable):
return
yield new_entry(line.strip())
#END endless loop
+
+ @classmethod
+ def entry_at(cls, filepath, index):
+ """:return: RefLogEntry at the given index
+ :param filepath: full path to the index file from which to read the entry
+ :param index: python list compatible index, i.e. it may be negative to
+ specifiy an entry counted from the end of the list
+
+ :raise IndexError: If the entry didn't exist
+ .. note:: This method is faster as it only parses the entry at index, skipping
+ all other lines. Nonetheless, the whole file has to be read if
+ the index is negative
+ """
+ fp = open(filepath, 'rb')
+ if index < 0:
+ return RefLogEntry.from_line(fp.readlines()[index].strip())
+ else:
+ # read until index is reached
+ for i in xrange(index+1):
+ line = fp.readline()
+ if not line:
+ break
+ #END abort on eof
+ #END handle runup
+
+ if i != index or not line:
+ raise IndexError
+ #END handle exception
+
+ return RefLogEntry.from_line(line.strip())
+ #END handle index
def to_file(self, filepath):
"""Write the contents of the reflog instance to a file at the given filepath.