Thread (1 message) 1 message, 1 author, 2016-06-15

Re: [RFH] revision limiting sometimes ignored

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:44:10

Junio C Hamano [off-list ref] writes:
Once we find the set of bottom commits in "newlist", we would
need to prove that none of them can be reached from any of the
negative commits still in "list".  We can do this traversal
using two bits from flags, exactly like commit.c::merge_bases()

    for each bottom commit B {
      L = empty list
      B.flags |= PARENT2
      L.append(B)
      for each negative commit C in "list from limit_list()"
          C.flags |= PARENT1
          L.append(C)
      while (L) {
          C = shift L;
          flag = C.flags & (PARENT1|PARENT2);
            if (flag ==  (PARENT1|PARENT2))
              continue; /* common */
          for each parent P of commit C:
              pflag = P.flags & (PARENT1|PARENT2);
              if (pflag == flag)
                    continue;
              P.flags |= flags;
                L.append(P)
      }
      if (B.flags & PARENT1)
          we still need to traverse -- everybody_uninteresting()
          in limit_list() main loop was not enough!
    }
Actually when we do this traversal, we can mark the positive
commits on "newlist" as negative when it is painted with
PARENT1.  I was assuming that as soon as we find that we are in
problematic history with this procedure we exit the whole thing
and resume to limit_list(), but we may be able to use this as
the postprocessing step to clean-up the result.  I just need to
prove that this postprocessing step will smudge all the "falsely
positive but in reality negative" ones...
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help