コード例 #1
0
 /// <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);
     }
 }