summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/container/history.py25
-rw-r--r--tests/ranger/container/test_container.py7
2 files changed, 26 insertions, 6 deletions
diff --git a/ranger/container/history.py b/ranger/container/history.py
index db2ea8ab..69c3da57 100644
--- a/ranger/container/history.py
+++ b/ranger/container/history.py
@@ -53,12 +53,31 @@ class History(object):
             self.add(item)
 
     def rebase(self, other_history):
+        """
+        Replace the past of this history by that of another.
+
+        This is used when creating a new tab to seamlessly blend in the history
+        of the old tab into the new one.
+
+        Example: if self is [a,b,C], the current item is uppercase, and
+        other_history is [x,Y,z], then self.merge(other_history) will result in
+        [x, y, C].
+        """
         assert isinstance(other_history, History)
-        index_offset = len(self._history) - self._index
-        self._history[:self._index + 1] = list(other_history._history)
+
+        if len(self._history) == 0:
+            self._index = 0
+            future_length = 0
+        else:
+            future_length = len(self._history) - self._index - 1
+
+        self._history[:self._index] = list(
+                other_history._history[:other_history._index + 1])
         if len(self._history) > self.maxlen:
             self._history = self._history[-self.maxlen:]
-        self._index = len(self._history) - index_offset
+
+        self._index = len(self._history) - future_length - 1
+        assert self._index < len(self._history)
 
     def __len__(self):
         return len(self._history)
diff --git a/tests/ranger/container/test_container.py b/tests/ranger/container/test_container.py
index fafb30c5..a24c3f8d 100644
--- a/tests/ranger/container/test_container.py
+++ b/tests/ranger/container/test_container.py
@@ -74,14 +74,15 @@ def testhistorybasic():
     otherh = history.History(maxlen=h)
     assert(list(h) == list(otherh))
 
-    # Rebase allow to merge entries with another history
+    # Rebase replaces the past of the history with that of another
     otherh = history.History(maxlen=h)
+    old_current_item = h.current()
     for entry in OTHER_TEST_ENTRIES:
         otherh.add(entry)
     assert list(otherh)[-3:] == ["42", "43", "44"]
     h.rebase(otherh)
-    assert h.current() == "44"
-    assert list(h)[-3:] == ['42', '43', '44']
+    assert h.current() == old_current_item
+    assert list(h)[-3:] == ['43', '44', old_current_item]
 
     # modify, modifies the top of the stack
     h.modify("23")