bisect-kit: fix bisector 'view' subcommand

'view' subcommand may fail when re-generate revlist. This affected all
bisectors using codechange module.

BUG=chromium:898431
TEST=/bisect_android_repo.py init --old 5055130 --new 5056166 --branch git_pi-arc

Change-Id: I7c56b8044ccd63bdc402d259fddcfb06f675ed1d
Reviewed-on: https://chromium-review.googlesource.com/1309853
Commit-Ready: Kuang-che Wu <kcwu@chromium.org>
Tested-by: Kuang-che Wu <kcwu@chromium.org>
Reviewed-by: Chung-yih Wang <cywang@chromium.org>
diff --git a/bisect_kit/codechange.py b/bisect_kit/codechange.py
index 8664fee..a0b4ad0 100644
--- a/bisect_kit/codechange.py
+++ b/bisect_kit/codechange.py
@@ -884,30 +884,26 @@
 
     return result
 
-  def view_rev_diff(self, old, new):
-    old_base, _, _ = parse_intra_rev(old)
-    _, new_next, _ = parse_intra_rev(new)
-    assert old_base != new_next
+  def view_rev_diff(self, revlist, old, new):
+    assert old in revlist
+    assert new in revlist
+    loaded_action_groups = None
+    old_idx = revlist.index(old)
+    new_idx = revlist.index(new)
 
-    revlist = []
-    rev_summary = {}
-    fixed_specs = self.spec_manager.collect_fixed_spec(old_base, new_next)
-    for i, spec in enumerate(fixed_specs[:-1]):
-      action_groups = self.load_action_groups_between_releases(
-          fixed_specs[i].name, fixed_specs[i + 1].name)
-      revlist.append(spec.name)
-      rev_summary[spec.name] = ''
-      for action_group in action_groups:
-        revlist.append(action_group.name)
-        rev_summary[action_group.name] = action_group.summary(self.code_storage)
-
-    revlist.append(fixed_specs[-1].name)
-    rev_summary[fixed_specs[-1].name] = ''
-
-    old_index = revlist.index(old)
-    new_index = revlist.index(new)
-    for rev in revlist[old_index:new_index + 1]:
-      logger.info('%s %s', rev, rev_summary[rev])
+    for i, rev in enumerate(revlist[old_idx:new_idx + 1], old_idx):
+      rev_old, rev_new, index = parse_intra_rev(rev)
+      if rev_old == rev_new:
+        logger.info('[%d] %s', i, rev)
+      else:
+        if loaded_action_groups != (rev_old, rev_new):
+          action_groups = self.load_action_groups_between_releases(
+              rev_old, rev_new)
+          loaded_action_groups = (rev_old, rev_new)
+        # Indexes inside intra_rev are 1 based.
+        action_group = action_groups[index - 1]
+        summary = action_group.summary(self.code_storage)
+        logger.info('[%d] %s %s', i, rev, summary)
 
   def switch(self, rev):
     # easy case