diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2010-11-24 19:36:34 +0100 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2010-11-24 19:37:06 +0100 |
commit | 98a313305f0d554a179b93695d333199feb5266c (patch) | |
tree | 853a7029fa8c532da110b11afc2b60027e267625 /refs/log.py | |
parent | 86523260c495d9a29aa5ab29d50d30a5d1981a0c (diff) | |
download | gitpython-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.py | 31 |
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. |