private void Add(RevCommit c) { int flag = walker.AllocFlag(); branchMask |= flag; if ((c.flags & branchMask) != 0) { // This should never happen. RevWalk ensures we get a // commit admitted to the initial queue only once. If // we see this marks aren't correctly erased. // throw new InvalidOperationException(MessageFormat.Format(JGitText.Get().staleRevFlagsOn , c.Name)); } c.flags |= flag; pending.Add(c); }
/// <exception cref="NGit.Errors.MissingObjectException"></exception> /// <exception cref="NGit.Errors.IncorrectObjectTypeException"></exception> /// <exception cref="System.IO.IOException"></exception> internal override RevCommit Next() { try { for (; ;) { RevCommit c = pending.Next(); if (c == null) { walker.reader.WalkAdviceEnd(); return(null); } bool produce; if ((c.flags & UNINTERESTING) != 0) { produce = false; } else { if (filter.RequiresCommitBody()) { c.ParseBody(walker); } produce = filter.Include(walker, c); } foreach (RevCommit p in c.parents) { if ((p.flags & SEEN) != 0) { continue; } if ((p.flags & PARSED) == 0) { p.ParseHeaders(walker); } p.flags |= SEEN; pending.Add(p); } walker.CarryFlagsImpl(c); if ((c.flags & UNINTERESTING) != 0) { if (pending.EverbodyHasFlag(UNINTERESTING)) { RevCommit n = pending.Peek(); if (n != null && n.commitTime >= last.commitTime) { // This is too close to call. The next commit we // would pop is dated after the last one produced. // We have to keep going to ensure that we carry // flags as much as necessary. // overScan = OVER_SCAN; } else { if (--overScan == 0) { throw StopWalkException.INSTANCE; } } } else { overScan = OVER_SCAN; } if (canDispose) { c.DisposeBody(); } continue; } if (produce) { return(last = c); } else { if (canDispose) { c.DisposeBody(); } } } } catch (StopWalkException) { walker.reader.WalkAdviceEnd(); pending.Clear(); return(null); } }