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 | |
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')
-rw-r--r-- | refs/log.py | 31 | ||||
-rw-r--r-- | refs/symbolic.py | 9 |
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): """ |