summaryrefslogtreecommitdiff
path: root/refs
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
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')
-rw-r--r--refs/log.py31
-rw-r--r--refs/symbolic.py9
2 files changed, 40 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.
diff --git a/refs/symbolic.py b/refs/symbolic.py
index f333bd46..6ba8083f 100644
--- a/refs/symbolic.py
+++ b/refs/symbolic.py
@@ -354,6 +354,15 @@ class SymbolicReference(object):
(newbinsha is None and self.commit.binsha) or newbinsha,
message)
+ def log_entry(self, index):
+ """:return: RefLogEntry at the given index
+ :param index: python list compatible positive or negative index
+
+ .. note:: This method must read part of the reflog during execution, hence
+ it should be used sparringly, or only if you need just one index.
+ In that case, it will be faster than the ``log()`` method"""
+ return RefLog.entry_at(RefLog.path(self), index)
+
@classmethod
def to_full_path(cls, path):
"""