示例#1
0
  @Override
  RevCommit next() throws MissingObjectException, IncorrectObjectTypeException, IOException {
    Generator g;

    final RevWalk w = walker;
    RevFilter rf = w.getRevFilter();
    final TreeFilter tf = w.getTreeFilter();
    AbstractRevQueue q = walker.queue;

    if (rf == RevFilter.MERGE_BASE) {
      // Computing for merge bases is a special case and does not
      // use the bulk of the generator pipeline.
      //
      if (tf != TreeFilter.ALL)
        throw new IllegalStateException(
            "Cannot combine TreeFilter " + tf + " with RevFilter " + rf + ".");

      final MergeBaseGenerator mbg = new MergeBaseGenerator(w);
      walker.pending = mbg;
      walker.queue = AbstractRevQueue.EMPTY_QUEUE;
      mbg.init(q);
      return mbg.next();
    }

    final boolean uninteresting = q.anybodyHasFlag(RevWalk.UNINTERESTING);
    boolean boundary = walker.hasRevSort(RevSort.BOUNDARY);

    if (!boundary && walker instanceof ObjectWalk) {
      // The object walker requires boundary support to color
      // trees and blobs at the boundary uninteresting so it
      // does not produce those in the result.
      //
      boundary = true;
    }
    if (boundary && !uninteresting) {
      // If we were not fed uninteresting commits we will never
      // construct a boundary. There is no reason to include the
      // extra overhead associated with that in our pipeline.
      //
      boundary = false;
    }

    final DateRevQueue pending;
    int pendingOutputType = 0;
    if (q instanceof DateRevQueue) pending = (DateRevQueue) q;
    else pending = new DateRevQueue(q);
    if (tf != TreeFilter.ALL) {
      rf = AndRevFilter.create(rf, new RewriteTreeFilter(w, tf));
      pendingOutputType |= HAS_REWRITE | NEEDS_REWRITE;
    }

    walker.queue = q;
    g = new PendingGenerator(w, pending, rf, pendingOutputType);

    if (boundary) {
      // Because the boundary generator may produce uninteresting
      // commits we cannot allow the pending generator to dispose
      // of them early.
      //
      ((PendingGenerator) g).canDispose = false;
    }

    if ((g.outputType() & NEEDS_REWRITE) != 0) {
      // Correction for an upstream NEEDS_REWRITE is to buffer
      // fully and then apply a rewrite generator that can
      // pull through the rewrite chain and produce a dense
      // output graph.
      //
      g = new FIFORevQueue(g);
      g = new RewriteGenerator(g);
    }

    if (walker.hasRevSort(RevSort.TOPO) && (g.outputType() & SORT_TOPO) == 0)
      g = new TopoSortGenerator(g);
    if (walker.hasRevSort(RevSort.REVERSE)) g = new LIFORevQueue(g);
    if (boundary) g = new BoundaryGenerator(w, g);
    else if (uninteresting) {
      // Try to protect ourselves from uninteresting commits producing
      // due to clock skew in the commit time stamps. Delay such that
      // we have a chance at coloring enough of the graph correctly,
      // and then strip any UNINTERESTING nodes that may have leaked
      // through early.
      //
      if (pending.peek() != null) g = new DelayRevQueue(g);
      g = new FixUninterestingGenerator(g);
    }

    w.pending = g;
    return g.next();
  }